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
相關文章
相關標籤/搜索