zoukankan      html  css  js  c++  java
  • Groovy 设计模式 -- 抽象工厂 模式

    抽象工厂

    https://blog.csdn.net/wyxhd2008/article/details/5597975

    首先来看看这两者的定义区别:

    工厂模式:定义一个用于创建对象的借口,让子类决定实例化哪一个类

    抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类

           个人觉得这个区别在于产品,如果产品单一,最合适用工厂模式,但是如果有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。再通俗深化理解下:工厂模式针对的是一个产品等级结构 ,抽象工厂模式针对的是面向多个产品等级结构的。

    再来看看工厂方法模式与抽象工厂模式对比:

    工厂方法模式

    抽象工厂模式

    针对的是一个产品等级结构 针对的是面向多个产品等级结构
    一个抽象产品类 多个抽象产品类
    可以派生出多个具体产品类 每个抽象产品类可以派生出多个具体产品类
    一个抽象工厂类,可以派生出多个具体工厂类 一个抽象工厂类,可以派生出多个具体工厂类
    每个具体工厂类只能创建一个具体产品类的实例 每个具体工厂类可以创建多个具体产品类的实例

           

    简单工厂

    https://www.cnblogs.com/zhangchenliang/p/3700820.html

    这个模式本身很简单而且使用在业务较简单的情况下。一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改)。
    它由三种角色组成:
    工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,根据逻辑不同,产生具体的工厂产品。如例子中的Driver类。
    抽象产品角色:它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。如例中的Car接口。
    具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现,如例子中的Benz、Bmw类。

      1. abstract class Car{  
      2.     private String name;  
      3.       
      4.     public abstract void drive();  
      5.       
      6.     public String getName() {  
      7.         return name;  
      8.     }  
      9.     public void setName(String name) {  
      10.         this.name = name;  
      11.     }  
      12. }  
      13. //具体产品  
      14. class Benz extends Car{  
      15.     public void drive(){  
      16.         System.out.println(this.getName()+"----go-----------------------");  
      17.     }  
      18. }  
      19.   
      20. class Bmw extends Car{  
      21.     public void drive(){  
      22.         System.out.println(this.getName()+"----go-----------------------");  
      23.     }  
      24. }  
      25.   
      26. //简单工厂  
      27. class Driver{  
      28.     public static Car createCar(String car){  
      29.         Car c = null;  
      30.         if("Benz".equalsIgnoreCase(car))  
      31.             c = new Benz();  
      32.         else if("Bmw".equalsIgnoreCase(car))  
      33.             c = new Bmw();  
      34.         return c;  
      35.     }  
      36. }  
      37.   
      38. //老板  
      39. public class BossSimplyFactory {  
      40.   
      41.     public static void main(String[] args) throws IOException {  
      42.         //老板告诉司机我今天坐奔驰  
      43.         Car car = Driver.createCar("benz");  
      44.         car.setName("benz");  
      45.          //司机开着奔驰出发  
      46.         car.drive();  
      47.     }  
      48. <span style="font-family: courier new,courier;">}</span> 

    抽象工厂 和 工厂模式 区别:

    https://www.zhihu.com/question/20367734

    作者:名姓
    链接:https://www.zhihu.com/question/20367734/answer/115807228
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    工厂模式也就是鼠标工厂是个父类,有生产鼠标这个接口。
    戴尔鼠标工厂,惠普鼠标工厂继承它,可以分别生产戴尔鼠标,惠普鼠标。
    生产哪种鼠标不再由参数决定,而是创建鼠标工厂时,由戴尔鼠标工厂创建。
    后续直接调用鼠标工厂.生产鼠标()即可


    抽象工厂模式

    抽象工厂模式也就是不仅生产鼠标,同时生产键盘。
    也就是PC厂商是个父类,有生产鼠标,生产键盘两个接口。
    戴尔工厂,惠普工厂继承它,可以分别生产戴尔鼠标+戴尔键盘,和惠普鼠标+惠普键盘。
    创建工厂时,由戴尔工厂创建。
    后续工厂.生产鼠标()则生产戴尔鼠标,工厂.生产键盘()则生产戴尔键盘。

    DEMO

    http://groovy-lang.org/design-patterns.html#_example

    def guessFactory = [messages: GuessGameMessages, control: GuessGameControl, converter: GuessGameInputConverter]
    def twoupFactory = [messages: TwoupMessages, control: TwoupControl, converter: TwoupInputConverter]
    
    class GameFactory {
        def static factory
        def static getMessages() { return factory.messages.newInstance() }
        def static getControl() { return factory.control.newInstance() }
        def static getConverter() { return factory.converter.newInstance() }
    }
    GameFactory.factory = twoupFactory
    def messages = GameFactory.messages
    def control = GameFactory.control
    def converter = GameFactory.converter
    println messages.welcome
    def reader = new BufferedReader(new InputStreamReader(System.in))
    while (control.moreTurns()) {
        def input = reader.readLine().trim()
        control.play(converter.convert(input))
    }
    println messages.done
  • 相关阅读:
    cf1100 F. Ivan and Burgers
    cf 1033 D. Divisors
    LeetCode 17. 电话号码的字母组合
    LeetCode 491. 递增的子序列
    LeetCode 459.重复的子字符串
    LeetCode 504. 七进制数
    LeetCode 3.无重复字符的最长子串
    LeetCode 16.06. 最小差
    LeetCode 77. 组合
    LeetCode 611. 有效三角形个数
  • 原文地址:https://www.cnblogs.com/lightsong/p/8655147.html
Copyright © 2011-2022 走看看