設計模式學習--Abstarct Factory,--abstarctfactory

來源:互聯網
上載者:User

設計模式學習--Abstarct Factory,--abstarctfactory
What

Abstarct Factory:提供一個建立一系列相關或相互依賴的介面,而無需指定他們具體類。

Why

Abstarct Factory是建立型設計模式的一種,主要在建立對象時解耦,避免對象的直接依賴,方便替換與定製。常見的比如:一個功能有兩種不同的風格,需要根據配置來切換不同的風格時,或者在一個需要適用於多個資料庫切換的程式中,都會使用Abstact Factory。
適用於Abstarct Factory的情境:
1、系統的展現或者功能需要可配置時。
2、系統模組的建立,需要獨立於系統模組時。
3、系統需要動態定製時。

How

假設如下情境,在編寫資料庫訪問層時,需要支援兩種資料庫的切換,比如可以支援sqlserver和mysql的切換。以這個簡單的例子,說明Abstarct Factory的實現
首先我們定義我們的dao介面:

public interface UserDao {    void insert(User user);    void delete(String id);    User find(String id);}

這個介面需要三個簡單的方法,插入,刪除,查詢
定義用於建立Dao執行個體的工廠介面

public interface DaoFactory {    UserDao create();}

用於訪問sqlserver的UserDao的實現

public class SqlServerUserDaoImpl implements UserDao {    @Override    public void insert(User user) {        System.out.println("sqlserver insert user");    }    @Override    public void delete(String id) {        System.out.println("sqlserver delete user");    }    @Override    public User find(String id) {        System.out.println("sqlserver find user");        return null;    }}

用於訪問mysql的UserDao的實現

public class MysqlUserDaoImpl implements UserDao {    @Override    public void insert(User user) {        System.out.println("mysql insert user");    }    @Override    public void delete(String id) {        System.out.println("mysql delete user");    }    @Override    public User find(String id) {        System.out.println("mysql find user");        return null;    }}

用於建立sqlserver userDao的工廠

public class SqlserverDaoFactoryImpl implements DaoFactory {    @Override    public UserDao create() {        return new SqlServerUserDaoImpl();    }}

用於建立mysql userDao的工廠

public class MysqlDaoFactoryImpl implements DaoFactory {    @Override    public UserDao create() {        return new MysqlUserDaoImpl();    }}

用戶端調用方法

public class App {    public static void main( String[] args ){        DaoFactory daoFactory=new MysqlDaoFactoryImpl();        UserDao userDao=daoFactory.create();        userDao.insert(null);        DaoFactory daoFactory1=new SqlserverDaoFactoryImpl();        UserDao userDao1=daoFactory1.create();        userDao1.delete("");    }}

以上執行個體的類圖如下:

Discuss

在以上的例子中,還可以延伸到把資料庫的選擇寫在設定檔中,然後在系統啟動時根據配置通過反射載入不同的程式,這個在以前使用c#做一個系統時用到過,在java的web開發中,一般使用spring架構,它提供了IOC技術,通過配置bean來做資料來源的初始化。
在spring的原始碼中,也有Abstract Factory的使用,比如BeanFactory就是一個例子,當然它的設計要比本文中的例子,複雜的多。

ChangeLog

在學習時發現本節樣本不夠完善,所以進行了完善,增加在ChangeLog中,兩者的區別和聯絡在設計模式學習--Factory Method的Discuss章節中。
範例程式碼基於以上樣本修改,如果理解了樣本中的代碼,修改為如下結構的代碼比較簡單就不在帖出,也可以到去我的GitHub下載。


對於Java的23種設計模式的難度排列

建立型模式
1、FACTORY
追MM少不了請吃飯了,麥當勞的雞翅和肯德基的雞翅都是MM愛吃的東西,雖然口味有所不同,但不管你帶MM去麥當勞或肯德基,只管向服務員說“來四個雞翅”就行了。麥當勞和肯德基就是生產雞翅的Factory

原廠模式:客戶類和工廠類分開。消費者任何時候需要某種產品,只需向工廠請求即可。消費者無須修改就可以接納新產品。缺點是當產品修改時,工廠類也要做相應的修改。如:如何建立及如何向用戶端提供。

2007-12-29 20:34 回複
2樓2、BUILDER
MM最愛聽的就是“我愛你”這句話了,見到不同地方的MM,要能夠用她們的方言跟她說這句話哦,我有一個多種語言翻譯機,上面每種語言都有一個按鍵,見到MM我只要按對應的鍵,它就能夠用相應的語言說出“我愛你”這句話了,國外的MM也可以輕鬆搞掂,這就是我的“我愛你”builder。(這一定比美軍在伊拉克用的翻譯機好賣)

建造模式:將產品的內部表象和產品的產生過程分割開來,從而使一個建造過程產生具有不同的內部表象的產品對象。建造模式使得產品內部表象可以獨立的變化,客戶不必知道產品內部組成的細節。建造模式可以強制實行一種分步驟進行的建造過程。

3樓3、FACTORY METHOD
請MM去麥當勞吃漢堡,不同的MM有不同的口味,要每個都記住是一件煩人的事情,我一般採用Factory Method模式,帶著MM到服務員那兒,說“要一個漢堡”,具體要什麼樣的漢堡呢,讓MM直接跟服務員說就行了。

Factory 方法模式:核心工廠類不再負責所有產品的建立,而是將具體建立的工作交給子類去做,成為一個抽象工廠角色,僅負責給出具體工廠類必須實現的介面,而不接觸哪一個產品類應當被執行個體化這種細節。

4樓4、PROTOTYPE
跟MM用QQ聊天,一定要說些深情的話語了,我搜集了好多肉麻的情話,需要時只要copy出來放到QQ裡面就行了,這就是我的情話prototype了。(100塊錢一份,你要不要)

原始模型模式:通過給出一個原型對象來指明所要建立的對象的類型,然後用複製這個原型對象的方法建立出更多同類型的對象。原始模型模式允許動態增加或減少產品類,產品類不需要非得有任何事先確定的等級結構,原始模型模式適用於任何的等級結構。缺點是每一個類都必須配備一個複製方法。

5樓5、SINGLETON
俺有6個漂亮的老婆,她們的老公都是我,我就是我們家裡的老公Sigleton,她們只要說道“老公”,都是指的同一個人,那就是我(剛才做了個夢啦,哪有這麼好的事)

單例模式:單例模式確保某一個類只有一個執行個體,而且自行執行個體化並向整個系統提供這個執行個體單例模式。單例模式只應在有真正的“單一執行個體”的需求時才可使用。

6樓結構型模式
6、ADAPTER
在朋友聚會上碰到了一個美女Sarah,從香港來的,可我不會說粵語,她不會說普通話,只好求助於我的朋友kent了,他作為我和Sarah之間的Adapter,讓我和Sarah可以相互交談了(也不知道他會不會耍我)

適配器(變壓器)模式:把一個類的介面變換成用戶端所期待的另一種介面,從而使原本因介面原因不匹配而無法一起工作的兩個類能夠一起工作。適配類可以根據參數返還一個合適的執行個體給用戶端。

7、BRIDGE
早上碰到MM,要說早上好,晚上碰到MM,要說晚上好;碰到MM穿了件新衣服,要說你的衣服好漂亮哦,碰到MM新做的髮型,要說你的頭髮好漂亮哦。不要問我“早上碰到MM新做了個髮型怎麼說”這種問題,自己用BRIDGE組合一下不就......餘下全文>>
 
java 23種設計模式

設計模式主要分三個類型:建立型、結構型和行為型。
其中建立型有:
一、Singleton,單例模式:保證一個類只有一個執行個體,並提供一個訪問它的全域訪問點
二、Abstract Factory,抽象工廠:提供一個建立一系列相關或相互依賴對象的介面,而無須指定它們的具體類。
三、Factory Method,Factory 方法:定義一個用於建立對象的介面,讓子類決定執行個體化哪一個類,Factory Method使一個類的執行個體化延遲到了子類。
四、Builder,建造模式:將一個複雜物件的構建與他的表示相分離,使得同樣的構建過程可以建立不同的表示。
五、Prototype,原型模式:用原型執行個體指定建立對象的種類,並且通過拷貝這些原型來建立新的對象。
行為型有:
六、Iterator,迭代器模式:提供一個方法順序訪問一個彙總對象的各個元素,而又不需要暴露該對象的內部表示。
七、Observer,觀察者模式:定義對象間一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知自動更新。
八、Template Method,模板方法:定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中,TemplateMethod使得子類可以不改變一個演算法的結構即可以重定義該演算法得某些特定步驟。
九、Command,命令模式:將一個請求封裝為一個對象,從而使你可以用不同的請求對客戶進行參數化,對請求排隊和記錄請求日誌,以及支援可撤銷的操作。
十、State,狀態模式:允許對象在其內部狀態改變時改變他的行為。對象看起來似乎改變了他的類。
十一、Strategy,策略模式:定義一系列的演算法,把他們一個個封裝起來,並使他們可以互相替換,本模式使得演算法可以獨立於使用它們的客戶。
十二、China of Responsibility,職責鏈模式:使多個對象都有機會處理請求,從而避免請求的送發者和接收者之間的耦合關係
十三、Mediator,中介者模式:用一個中介對象封裝一些列的對象互動。
十四、Visitor,訪問者模式:表示一個作用於某對象結構中的各元素的操作,它使你可以在不改變各元素類的前提下定義作用於這個元素的新操作。
十五、Interpreter,解譯器模式:給定一個語言,定義他的文法的一個表示,並定義一個解譯器,這個解譯器使用該表示來解釋語言中的句子。
十六、Memento,備忘錄模式:在不破壞對象的前提下,捕獲一個對象的內部狀態,並在該對象之外儲存這個狀態。
結構型有:
十七、Composite,組合模式:將對象組合成樹形結構以表示部分整體的關係,Composite使得使用者對單個對象和組合對象的使用具有一致性。
十八、Facade,面板模式:為子系統中的一組介面提供一致的介面,fa?ade提供了一高層介面,這個介面使得子系統更容易使用。
十九、Proxy,代理模式:為其他對象提供一種代理以控制對這個對象的訪問
二十、Adapter,適配器模式:將一類的介面轉換成客戶希望的另外一個介面,Adapter模式使得原本由於介面不相容而不能一起工作那些類可以一起工作。
二十一、Decrator,裝飾模式:動態地給一個對象增加一些額外的職責,就增加的功能來說,Decorator模式相比產生子類更加靈活。
二十二、Bridge,橋模式:將抽象部分與它的實現部分......餘下全文>>
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.