Groovy 设计模式 -- 抽象工厂 模式

 

抽象工厂

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

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

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

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

       我的以为这个区别在于产品,若是产品单一,最合适用工厂模式,可是若是有多个业务品种、业务分类时,经过抽象工厂模式产生须要的对象是一种很是好的解决方式。再通俗深化理解下:工厂模式针对的是一个产品等级结构 ,抽象工厂模式针对的是面向多个产品等级结构的。.net

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

 

工厂方法模式htm

抽象工厂模式对象

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

       

 

 

简单工厂

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

这个模式自己很简单并且使用在业务较简单的状况下。通常用于小项目或者具体产品不多扩展的状况(这样工厂类才不用常常更改)。
它由三种角色组成:
工厂类角色:这是本模式的核心,含有必定的商业逻辑和判断逻辑,根据逻辑不一样,产生具体的工厂产品。如例子中的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
相关文章
相关标签/搜索