-
什么情況下適合工廠模式查看全部
-
工廠模式意圖查看全部
-
工廠模式查看全部
-
工廠模式查看全部
-
設(shè)計模式是有限的使用案例,使用設(shè)計模式可提高代碼的重用性、代碼更容易被他人理解、保證代碼的可靠性。
查看全部 -
設(shè)計模式(Design Pattern)是一套被反復使用、多數(shù)人知曉的、經(jīng)過分類編目的,代碼設(shè)計經(jīng)驗的總結(jié)
查看全部 -
工廠模式查看全部
-
@設(shè)計模式---工廠模式的總結(jié)
一、工廠方法模式和抽象工廠模式的對比:
????1.工廠模式是一種極端情況下的抽象工廠模式,通過前面的類圖和代碼實現(xiàn)我們可以看到這樣一個對比,而抽象工廠模式可以看成是工廠模式的推廣,
????2.工廠模式用來創(chuàng)建一個產(chǎn)品的等級結(jié)構(gòu),而抽象工廠模式是用來創(chuàng)建多個產(chǎn)品的等級結(jié)構(gòu),
????3.工廠模式只有一個抽象產(chǎn)品類,而抽象工廠模式有多個抽象產(chǎn)品類,總之就是單一對多個產(chǎn)品的這種對比。二、工廠模式幫助我們實現(xiàn)了什么呢?
????1.系統(tǒng)可以在不修改具體工廠角色的情況下引進新的產(chǎn)品,
????2.客戶端不必關(guān)系對象如何去創(chuàng)建,明確了職責,對象具體的創(chuàng)建交給了具體的產(chǎn)品,product1,product2,客戶端只要告訴工廠我需要哪一,product1還是product2,它們具體是怎么創(chuàng)建的,怎么組合的,都交給了具體的產(chǎn)品product1,product2
????3.更好的理解面向?qū)ο蟮脑瓌t,面向接口編程,而不是面向?qū)崿F(xiàn)編程。
那我們整體的工廠模式就是這樣一個原則。三、工廠模式適用于哪些場景呢?
????1.一個系統(tǒng)應當不依賴于產(chǎn)品類實例被創(chuàng)立,組成和表示的細節(jié),就是說這個產(chǎn)品如何被創(chuàng)建,組成和表現(xiàn),我們都歸結(jié)到具體的產(chǎn)品是如何實現(xiàn)上去了,與前端的client,和中端的factory都是沒有關(guān)系的,
????2.這個系統(tǒng)的產(chǎn)品至少有一個產(chǎn)品族,工廠方法模式就是一個產(chǎn)品族,它是最簡單的一個等級,
????3.同屬于同一個產(chǎn)品族的產(chǎn)品是設(shè)計成在一起使用的,這是毋庸置疑的,同屬于一個系列的產(chǎn)品,就是在一起的,
????4.不同的產(chǎn)品以一系列的接口的面貌出現(xiàn),從未使系統(tǒng)不依賴于接口實現(xiàn)的細節(jié),我們都是面向接口編程的,不是面向?qū)崿F(xiàn)編程的,查看全部 -
@設(shè)計模式---工廠模式之 抽象工廠模式
1.創(chuàng)建兩個接口,如:Boy,有drawMan();Girl,有drawWoman()。public?interface?Boy?{ ??public?void?drawMan(); } public?interface?Girl?{ ??public?void?drawWoman(); }
2.創(chuàng)建接口的各兩個實現(xiàn)類,如:HNBoy、MCBoy;HNGirl、MCGirl。
public?class?HNBoy?implements?Boy?{ ??@Override ??public?void?drawMan()?{ ????System.out.println("新年系列的男孩"); ??} } public?class?MCBoy?implements?Boy?{ ??@Override ??public?void?drawMan()?{ ????System.out.println("圣誕系列的男孩"); ??} } public?class?HNGirl?implements?Girl?{ ??@Override ??public?void?drawWoman()?{ ????System.out.println("圣誕系列的女孩"); ??} } public?class?MCGirl?implements?Girl?{ ??@Override ??public?void?drawWoman()?{ ????System.out.println("圣誕系列的女孩"); ??} }
3.創(chuàng)建主工廠接口,如:PersonFactory。
public?interface?PersonFactory?{ ??//男孩接口 ??public?Boy?getBoy(); ??//女孩接口 ??public?Girl?getGirl(); }
4.創(chuàng)建次工廠類實現(xiàn)主工廠接口,如:HNFactory和MCFactory。
public?class?HNFactory?implements?PersonFactory?{ ??@Override ??public?Boy?getBoy()?{ ????return?new?HNBoy(); ??} ??@Override ??public?Girl?getGirl()?{ ????return?new?HNGirl(); ??} } public?class?MCFactory?implements?PersonFactory?{ ??@Override ??public?Boy?getBoy()?{ ????return?new?MCBoy(); ??} ??@Override ??public?Girl?getGirl()?{ ????return?new?MCGirl(); ??} }
5.測試用例
PersonFactory?factory?=?new?MCFactory(); Girl?girl?=?factory.getGirl(); girl.drawWoman();
查看全部 -
@設(shè)計模式---工廠模式之 工廠方法模式
1.創(chuàng)建一個接口,如:HairInterface,有個抽象方法draw。public?interface?HairInterface?{ ????public?void?draw(); }
2.創(chuàng)建實現(xiàn)接口的子類,如:LeftHair、RightHair、InHair。
public?class?LeftHair?implements?HairInterface?{ ????@Override ????public?void?draw()?{ ????????System.out.println("左偏分發(fā)型"); ????} }
3.創(chuàng)建工廠類,如:HairFactory,根據(jù)類的名稱來生產(chǎn)對象。
public?HairInterface?getHairByClass(String?className){ ????try?{ ????????HairInterface?hair=(HairInterface)?Class.forName(className).newInstance(); ????????return?hair; ????}?catch?(InstantiationException?e)?{ ????????e.printStackTrace(); ????}?catch?(IllegalAccessException?e)?{ ????????e.printStackTrace(); ????}?catch?(ClassNotFoundException?e)?{ ????????e.printStackTrace(); ????} ????return?null; }
4.通過映射文件,簡化類的名稱,如:type.properties。
left=onetry.DesigntonDemo.LeftHair right=onetry.DesigntonDemo.RighttHair in=onetry.DesigntonDemo.InHair
5.創(chuàng)建properties文件的讀取工具,如:PropertiesReader。
public?class?PropertiesReader?{ ????public?Map<String,String>?getProperties(){?? ????????Properties?props?=?new?Properties(); ????????Map<String,String>?map?=?new?HashMap<String,String>(); ????????try{ ??????????//以流的形式讀取properties文件 ??????????InputStream?in?=?getClass().getResourceAsStream("type.properties")?; ??????????props.load(in); ??????????Enumeration?en?=?props.propertyNames(); ??????????while(en.hasMoreElements()){ ??????????????String?key?=?(String)?en.nextElement(); ??????????????String?property?=?props.getProperty(key); ??????????????map.put(key,?property); ????????????} ????????}catch(Exception?e){ ??????????e.printStackTrace(); ????????} ????????return?map; ????} }
6.修改HairFactory,用PropertiesReader讀取 替換 原來的className。
public?HairInterface?getHairByClassKey(String?key){ ????try?{ ??????Map<String,String>?map?=?new?PropertiesReader().getProperties(); ??????HairInterface?hair=(HairInterface)Class.forName(map.get(key)).newInstance(); ??????return?hair; ????}?catch?(InstantiationException?e)?{ ??????e.printStackTrace(); ????}?catch?(IllegalAccessException?e)?{ ??????e.printStackTrace(); ????}?catch?(ClassNotFoundException?e)?{ ??????e.printStackTrace(); ????} ????return?null; }
7.測試用例
HairFactory?factory?=?new?HairFactory(); //HairInterface?left?=?factory.getHairByClass("onetry.DesigntonDemo.LeftHair"); HairInterface?hair?=?factory.getHairByClassKey("in"); hair.draw();
查看全部 -
@設(shè)計模式---工廠模式
一、工廠模式概念
????1.實例化對象,用工廠方法代替new操作;
????2.包括工廠方法模式和抽象工廠模式;
????3.抽象工廠模式是工廠方法模式的推廣。
二、工廠模式的意圖
????1.定義【接口】來創(chuàng)建對象,但讓子類來決定哪些類需要被實例化;
????2.工廠方法把實例化的工作推遲到子類中去實現(xiàn)。
三、適合工廠模式的情況
????1.有一組類似的對象需要創(chuàng)建。
????2.在編碼的時候不能預見需要創(chuàng)建哪種類的實例。
????3.系統(tǒng)需要考慮擴展性,不應依賴于產(chǎn)品類實例化如何被創(chuàng)建,組合和表達的細節(jié)。
四、項目中的現(xiàn)狀
????在軟件系統(tǒng)中經(jīng)常面臨著“對象”的創(chuàng)建工作,由于需求的變化,這個對象可能隨之也會發(fā)生變化,但它卻擁有比較穩(wěn)定的接口。為此,我們需要提供一種封裝機制來隔離出這個易變對象的變化,從而保持系統(tǒng)中其他依賴該對象的對象不隨著需求變化而變化。
五、基于項目現(xiàn)狀將代碼進行如下設(shè)計
????1.盡量松耦合,一個對象的依賴隊形的變化與本身無關(guān);
????2.具體產(chǎn)品與客戶端剝離,責任分割。查看全部 -
接口創(chuàng)建對象,子類決定哪些被實例化
查看全部 -
查看全部
-
查看全部
-
查看全部
舉報