设计模式-工厂设计模式
做用:** 負(fù)責(zé)創(chuàng)建對(duì)象,使用戶無需考慮對(duì)象的創(chuàng)建細(xì)節(jié),屬于創(chuàng)建型設(shè)計(jì)模式
測(cè)試被用到的類
頂層接口Person類
//頂層接口 public interface Phone {//定義的普通方法public void printName();}小米手機(jī)實(shí)體類實(shí)現(xiàn)了接口Phone
//小米手機(jī)實(shí)體類實(shí)現(xiàn)了接口Phone public class MiPhone implements Phone {@Overridepublic void printName() {System.out.println("小米手機(jī)被創(chuàng)建。。。。");} }華為手機(jī)實(shí)體類實(shí)現(xiàn)了接口Phone
//華為手機(jī)實(shí)體類實(shí)現(xiàn)了接口Phone public class HwPhone implements Phone {@Overridepublic void printName() {System.out.println("華為手機(jī)被創(chuàng)建。。。");} }蘋果手機(jī)實(shí)體類實(shí)現(xiàn)了接口Phone
//蘋果手機(jī)實(shí)體類實(shí)現(xiàn)了接口Phone public class IPhone implements Phone {@Overridepublic void printName() {System.out.println("蘋果手機(jī)被創(chuàng)建。。");} }簡(jiǎn)單工廠
public class SimpleFactoryPattern {private String Mi = "小米";private String HW = "華為";private String IPhone = "蘋果";public Phone createPerson(String name){if(Mi.equals(name)){return new MiPhone();}else if (HW.equals(name)){return new HwPhone();}else if (IPhone.equals(name)){return new IPhone();}//都不滿足返回nullreturn null;} }測(cè)試
//測(cè)試簡(jiǎn)單工廠//創(chuàng)建對(duì)象SimpleFactoryPattern simpleFactory = new SimpleFactoryPattern();//通過對(duì)象獲取實(shí)例Phone mi = simpleFactory.createPhone("小米");Phone iPhone = simpleFactory.createPhone("蘋果");Phone HW = simpleFactory.createPhone("華為");//調(diào)用方法測(cè)試mi.printName();iPhone.printName();HW.printName();//測(cè)試結(jié)果:小米手機(jī)被創(chuàng)建。。。。 蘋果手機(jī)被創(chuàng)建。。 華為手機(jī)被創(chuàng)建。。。Process finished with exit code 0總結(jié):
? 特點(diǎn):
? 在創(chuàng)建對(duì)象時(shí),對(duì)象的創(chuàng)建過程完全由工廠實(shí)現(xiàn),用戶不需要考慮創(chuàng)建細(xì)節(jié)。
? 出現(xiàn)問題:
? 1.當(dāng)我們想再添加同樣的類時(shí),就需要修改工廠內(nèi)的邏輯,違反了開閉原則,不利于擴(kuò)展。
? 2.因?yàn)槭且罁?jù)字符串判斷,不嚴(yán)謹(jǐn),容易出現(xiàn)誤差。
方法工廠
頂層的工廠接口(定義工廠的結(jié)構(gòu))
//最頂層的工廠接口 public interface MethodFactoryPattern {public Phone createPhone();}蘋果手機(jī)工廠實(shí)現(xiàn)了MethodFactoryPattern工廠
//創(chuàng)建蘋果手機(jī)的工廠 public class IPhoneFactory implements MethodFactoryPattern{@Overridepublic Phone createPhone() {return new IPhone();} }小米手機(jī)工廠實(shí)現(xiàn)了MethodFactoryPattern工廠
//創(chuàng)建小米手機(jī)的工廠 public class MiFactory implements MethodFactoryPattern{@Overridepublic Phone createPhone() {return new MiPhone();} }測(cè)試
//測(cè)試方法工廠//獲取蘋果手機(jī)工廠MethodFactoryPattern iPhoneFactory = new IPhoneFactory();//蘋果手機(jī)工廠創(chuàng)建蘋果手機(jī)Phone iPhone = iPhoneFactory.createPhone();iPhone.printName();//獲取小米手機(jī)工廠MethodFactoryPattern miFactory = new MiFactory();//小米手機(jī)工廠創(chuàng)建小米手機(jī)Phone miPhone = miFactory.createPhone();miPhone.printName();//測(cè)試結(jié)果 蘋果手機(jī)被創(chuàng)建。。 小米手機(jī)被創(chuàng)建。。。。Process finished with exit code 0總結(jié):
? 特點(diǎn):方法工廠模式中對(duì)工廠也定義了抽象,再添加新的產(chǎn)品時(shí),已經(jīng)不需要去修改工廠,而是直 接添加相應(yīng)的工廠,再去添加產(chǎn)品。遵守了開閉原則,有利于程序的擴(kuò)展。
? 問題:類結(jié)構(gòu)體系相對(duì)復(fù)雜,比較難以理解。
測(cè)試抽象工廠添加一套電腦產(chǎn)品測(cè)試類
電腦產(chǎn)品的頂層抽象
//電腦產(chǎn)品的頂層抽象 public interface Computer {public void printName();}小米電腦實(shí)體類實(shí)現(xiàn)了Computer接口
//小米電腦實(shí)體類實(shí)現(xiàn)了Computer接口 public class MiComputer implements Computer{@Overridepublic void printName() {System.out.println("小米電腦。。。");} }蘋果電腦實(shí)體類實(shí)現(xiàn)了Computer接口
//蘋果電腦實(shí)體類實(shí)現(xiàn)了Computer接口 public class AppleComputer implements Computer{@Overridepublic void printName() {System.out.println("蘋果電腦創(chuàng)建。。。");} }華為電腦實(shí)體類實(shí)現(xiàn)了Computer接口
//華為電腦實(shí)體類實(shí)現(xiàn)了Computer接口 public class HWComputer implements Computer {@Overridepublic void printName() {System.out.println("小米電腦。。。");}}抽象工廠
抽象工廠的頂層接口
public interface AbstractFactory {//創(chuàng)建手機(jī)public Phone createPhone();//創(chuàng)建電腦public Computer createComputer();}蘋果工廠實(shí)現(xiàn)了AbstractFactory
//蘋果工廠實(shí)現(xiàn)了AbstractFactory public class AppleFactory implements AbstractFactory{@Overridepublic Phone createPhone() {return new IPhone();}@Overridepublic Computer createComputer() {return new AppleComputer();} }小米工廠實(shí)現(xiàn)了AbstractFactory
//小米公司實(shí)現(xiàn)了AbstractFactory public class MiFactory implements AbstractFactory{@Overridepublic Phone createPhone() {return new MiPhone();}@Overridepublic Computer createComputer() {return new MiComputer();} }華為公司實(shí)現(xiàn)了AbstractFactory
//華為公司實(shí)現(xiàn)了AbstractFactory public class HWFactory implements AbstractFactory{@Overridepublic Phone createPhone() {return new HwPhone();}@Overridepublic Computer createComputer() {return new HWComputer();} }測(cè)試
//測(cè)試抽象工廠//如果想買蘋果手機(jī)//獲取蘋果公司AbstractFactory appleFactory = new AppleFactory();//蘋果公司生產(chǎn)蘋果手機(jī)Phone iPhone = appleFactory.createPhone();iPhone.printName();//如果想小米電腦//獲取小米公司AbstractFactory miFactory = new MiFactory();//小米公司生產(chǎn)小米電腦Computer miComputer = miFactory.createComputer();miComputer.printName();//測(cè)試結(jié)果 蘋果手機(jī)被創(chuàng)建。。 小米電腦。。。Process finished with exit code 0總結(jié)
? 特點(diǎn):
? 將一整個(gè)品牌交由工廠管理,使產(chǎn)品的創(chuàng)建隔離。
? 當(dāng)添加一整套產(chǎn)品組(比如聯(lián)想公司的加入),不需要修改原有代碼。實(shí)現(xiàn)接口即可。
?
? 出現(xiàn)的問題:
? 如果當(dāng)蘋果公司加入新產(chǎn)品,比如平板電腦,就回影響整個(gè)體系結(jié)構(gòu),不利于單個(gè)產(chǎn)品的更改
? 抽象工廠模式只適用于一整套產(chǎn)品組的增加,不適用于單個(gè)產(chǎn)品的維護(hù)
最后總結(jié)
簡(jiǎn)單工廠:
? 不能算是真正意義上的設(shè)計(jì)模式,但可以將客戶程序從具體類解耦,適合類大量重復(fù)的創(chuàng)建。
工廠方法:
? 使用繼承,把對(duì)象的創(chuàng)建委托給子類,由子類來實(shí)現(xiàn)創(chuàng)建方法,適用于產(chǎn)品數(shù)量不穩(wěn)定。
抽象工廠:
? 可以說是將整個(gè)產(chǎn)品組看做成一個(gè)產(chǎn)品,適用于群體類型結(jié)構(gòu)。
工廠模式可以幫助我們針對(duì)抽象/接口編程,而不是針對(duì)具體類編程,在不同的場(chǎng)景下按具體情況來使用
總結(jié)
以上是生活随笔為你收集整理的设计模式-工厂设计模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高清视频转换器,任意格式互转方法!
- 下一篇: iOS开发 - 面向对象设计的设计模式(