• 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
  • 相关阅读:
    数据结构-串的堆分配存储
    ServerSocket
    Java-坦克大战
    Java-输入输出流
    MyEclipse 快捷键
    数据结构-串的定长顺序存储
    我的软考资料集合
    软考中级软件设计师考试大纲
    2016年第一季度阅读书目
    中国大陆开源镜像网站汇总
  • 原文地址:https://www.cnblogs.com/lightsong/p/8655147.html
Copyright © 2020-2023  润新知