创建型模式二:工厂方法模式
1. 工廠模式介紹
工廠模式(Factory Pattern)的意義就跟它的名字一樣,在面向?qū)ο蟪绦蛟O(shè)計(jì)中,工廠通常是一個(gè)用來創(chuàng)建其他對(duì)象的對(duì)象。工廠模式根據(jù)不同的參數(shù)來實(shí)現(xiàn)不同的分配方案和創(chuàng)建對(duì)象。
在工廠模式中,我們?cè)趧?chuàng)建對(duì)象時(shí)不會(huì)對(duì)客戶端暴露創(chuàng)建邏輯,并且是通過使用一個(gè)共同的接口來指向新創(chuàng)建的對(duì)象。例如用工廠來創(chuàng)建 人 這個(gè)對(duì)象,如果我們需要一個(gè)男人對(duì)象,工廠就會(huì)為我們創(chuàng)建一個(gè)男人;如果我們需要一個(gè)女人,工廠就會(huì)為我們生產(chǎn)一個(gè)女人。
工廠模式通常分為:
普通工廠模式
多個(gè)工廠方法模式
靜態(tài)工廠方法模式
2. 普通工廠模式
剛剛我們說到,用工廠模式來創(chuàng)建人。先創(chuàng)建一個(gè)男人,他每天都 “吃飯、睡覺、打豆豆”,然后我們?cè)賱?chuàng)建一個(gè)女人,她每天也“吃飯、睡覺、打豆豆”。
示例代碼如下(下面的代碼塊中是全部的代碼,實(shí)際操作中應(yīng)當(dāng)按注釋創(chuàng)建相應(yīng)的類再將方法寫入對(duì)應(yīng)的類中):
// 二者共同的接口 public interface Human{public void eat();public void sleep();public void beat(); }// 創(chuàng)建實(shí)現(xiàn)類 Male public class Male implements Human{public void eat(){System.out.println("Male can eat."); }public void sleep(){System.out.println("Male can sleep.");}public void beat(){System.out.println("Male can beat.");} } //創(chuàng)建實(shí)現(xiàn)類 Female public class Female implements Human{public void eat(){System.out.println("Female can eat."); }public void sleep(){System.out.println("Female can sleep.");}public void beat(){System.out.println("Female can beat.");} } // 創(chuàng)建普通工廠類 public class HumanFactory{public Human createHuman(String gender){if( gender.equals("male") ){return new Male();}else if( gender.equals("female")){return new Female();}else {System.out.println("請(qǐng)輸入正確的類型!");return null;}} }// 工廠測試類 public class FactoryTest {public static void main(String[] args){HumanFactory factory = new HumanFactory();Human male = factory.createHuman("male");male.eat();male.sleep();male.beat();} }運(yùn)行結(jié)果:
3. 多個(gè)工廠方法模式
普通工廠模式就是上面那樣子了,那么多個(gè)工廠方法模式又有什么不同呢?在普通工廠方法模式中,如果傳遞的字符串出錯(cuò),則不能正確創(chuàng)建對(duì)象。多個(gè)工廠方法模式是提供多個(gè)工廠方法,分別創(chuàng)建對(duì)象。
//部分示例代碼,其他與上面普通工廠模式示例代碼一樣:// 多個(gè)工廠方法 public class HumanFactory{public Male createMale() {return new Male();}public Female createFemale() {return new Female();} }// 工廠測試類 public class FactoryTest {public static void main(String[] args){HumanFactory factory = new HumanFactory();Human male = factory.createMale();male.eat();male.sleep();male.beat();} }//運(yùn)行結(jié)果與普通工廠模式的示例一樣。4. 靜態(tài)工廠方法模式
將上面的多個(gè)工廠方法模式里的方法置為靜態(tài)的,不需要?jiǎng)?chuàng)建實(shí)例,直接調(diào)用即可。
// 多個(gè)工廠方法 public class HumanFactory{public static Male createMale() {return new Male();}public static Female createFemale() {return new Female();} }// 工廠測試類 public class FactoryTest {public static void main(String[] args){Human male = HumanFactory.createMale();male.eat();male.sleep();male.beat();} }總結(jié):凡是出現(xiàn)了大量的產(chǎn)品需要?jiǎng)?chuàng)建,并且具有共同的接口時(shí),可以通過工廠方法模式進(jìn)行創(chuàng)建。在以上的三種模式中,第一種如果傳入的字符串有誤,不能正確創(chuàng)建對(duì)象,第三種相對(duì)于第二種,不需要實(shí)例化工廠類,所以,大多數(shù)情況下,我們會(huì)選用第三種——靜態(tài)工廠方法模式。
總結(jié)
以上是生活随笔為你收集整理的创建型模式二:工厂方法模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java迭代器 异常_java-迭代器并
- 下一篇: 1088. [SCOI2005]扫雷Mi