[设计模式]工厂模式factory
參考:http://wxg6203.iteye.com/blog/740229
?
簡(jiǎn)單工廠模式(simple factory)是類(lèi)的創(chuàng)建模式,又叫靜態(tài)工廠方法(static factory method)模式。
簡(jiǎn)單工廠模式就是由一個(gè)工廠類(lèi)根據(jù)傳入的參數(shù)決定創(chuàng)建哪一種的產(chǎn)品類(lèi)。
?
有4個(gè)角色
?
工廠類(lèi)角色:是具體產(chǎn)品類(lèi)角色直接調(diào)用者。?
抽象產(chǎn)品角色:接口或抽象類(lèi),負(fù)責(zé)具體產(chǎn)品角色的定義,及與客戶端的交互。?
具體產(chǎn)品角色:被工廠類(lèi)創(chuàng)建的對(duì)象,也是客戶端實(shí)際操作對(duì)象。?
客戶端:調(diào)用工廠類(lèi)產(chǎn)生實(shí)例,并調(diào)用實(shí)例的方法進(jìn)行相應(yīng)工作。
?
public interface people{public void say();}public class chinese implements people{public void say(){System.out.println("說(shuō)中國(guó)話");}}public class american implements people{public void say(){System.out.println("speak english");}}public class peopleFactory{public static people create(int type){if(type==1){return new chinese();}else if(type==2){return new american();}}}public class test{public static void main(String []args){people p=peopleFactory.create(1);p.say();p=peopleFactory.create(2);p.say();}}?
?
?
?
工廠方法模式是簡(jiǎn)單工廠模式的衍生,解決了許多簡(jiǎn)單工廠模式的問(wèn)題。
首先完全實(shí)現(xiàn)‘開(kāi)-閉 原則’,實(shí)現(xiàn)了可擴(kuò)展。其次更復(fù)雜的層次結(jié)構(gòu),可以應(yīng)用于產(chǎn)品結(jié)果復(fù)雜的場(chǎng)合。
工廠方法模式的對(duì)簡(jiǎn)單工廠模式進(jìn)行了抽象。有一個(gè)抽象的Factory類(lèi)(可以是抽象類(lèi)和接口),這個(gè)類(lèi)將不在負(fù)責(zé)具體的產(chǎn)品生產(chǎn),而是只制定一些規(guī)范,具體的生產(chǎn)工作由其子類(lèi)去完成。在這個(gè)模式中,工廠類(lèi)和產(chǎn)品類(lèi)往往可以依次對(duì)應(yīng)。即一個(gè)抽象工廠對(duì)應(yīng)一個(gè)抽象產(chǎn)品,一個(gè)具體工廠對(duì)應(yīng)一個(gè)具體產(chǎn)品,這個(gè)具體的工廠就負(fù)責(zé)生產(chǎn)對(duì)應(yīng)的產(chǎn)品。
工廠方法模式(Factory Method pattern)是最典型的模板方法模式(Templete Method pattern)應(yīng)用。
?
?如圖:
?
?
基于面向接口編程的原理,創(chuàng)建部分成為抽象工廠與實(shí)體工廠,創(chuàng)建出的對(duì)象成為抽象產(chǎn)品與實(shí)體產(chǎn)品。你可能知道為什么它能解決上面的問(wèn)題了:多了一個(gè)新對(duì)象,只需添加一套對(duì)應(yīng)的工廠和產(chǎn)品就可以了,不需要修改原代碼,或只需進(jìn)行少量的修改。
?
具體:
實(shí)體工廠實(shí)現(xiàn)抽象工廠,實(shí)體產(chǎn)品實(shí)現(xiàn)抽象產(chǎn)品;抽象工廠生產(chǎn)抽象產(chǎn)品,實(shí)體工廠生產(chǎn)實(shí)體產(chǎn)品;實(shí)體工廠A生產(chǎn)實(shí)體產(chǎn)品A,實(shí)體工廠B生產(chǎn)實(shí)體產(chǎn)品B。
?
public interface Icar{public void docar();}public class bwm implements Icar{public void docar(){System.out.println("我是寶馬,別摸我");}}public class buick implements Icar{public void docar(){System.out.println("我是別克,很酷");}}public interface Icarfactory{public Icar createCar();} public class bmwFactory implements Icarfactory{public Icar createCar(){return new bwm();}} public class buickFactory implements Icarfactory{public Icar createCar(){return new buick();}} public class test{public static void main(String []args){Icarfactory factory=new bmwFactory();Icar bwm= factory.createCar(); bwm.docar();factory=new buickFactory();Icar buick= factory.createCar(); buick.docar();}}?
抽象工廠模式是所有形態(tài)的工廠模式中最為抽象和最具一般性的一種形態(tài)。
抽象工廠模式是指當(dāng)有多個(gè)抽象角色時(shí),使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個(gè)接口,使客戶端在不必指定產(chǎn)品的具體的情況下,創(chuàng)建多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象。根據(jù)LSP原則,任何接受父類(lèi)型的地方,都應(yīng)當(dāng)能夠接受子類(lèi)型。因此,實(shí)際上系統(tǒng)所需要的,僅僅是類(lèi)型與這些抽象產(chǎn)品角色相同的一些實(shí)例,而不是這些抽象產(chǎn)品的實(shí)例。換言之,也就是這些抽象產(chǎn)品的具體子類(lèi)的實(shí)例。工廠類(lèi)負(fù)責(zé)創(chuàng)建抽象產(chǎn)品的具體子類(lèi)的實(shí)例。
?
簡(jiǎn)介
??? ?當(dāng)每個(gè)抽象產(chǎn)品都有多于一個(gè)的具體子類(lèi)的時(shí)候,工廠角色怎么知道實(shí)例化哪一個(gè)子類(lèi)呢?比如每個(gè)抽象產(chǎn)品角色都有兩個(gè)具體產(chǎn)品。抽象工廠模式提供兩個(gè)具體工廠角色,分別對(duì)應(yīng)于這兩個(gè)具體產(chǎn)品角色,每一個(gè)具體工廠角色只負(fù)責(zé)某一個(gè)產(chǎn)品角色的實(shí)例化。每一個(gè)具體工廠類(lèi)只負(fù)責(zé)創(chuàng)建抽象產(chǎn)品的某一個(gè)具體子類(lèi)的實(shí)例。
每一個(gè)模式都是針對(duì)一定問(wèn)題的解決方案,工廠方法模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu);而抽象工廠模式針對(duì)的是多個(gè)產(chǎn)品等級(jí)結(jié)果。
轉(zhuǎn)載于:https://www.cnblogs.com/lyggqm/p/7098698.html
總結(jié)
以上是生活随笔為你收集整理的[设计模式]工厂模式factory的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 启动Nginx 出现 nginx: [e
- 下一篇: 【MVC】ASP.NET MVC5 使用