您好,欢迎访问三七文档
第二讲工厂模式为什么要建工厂?设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案,是解决某个方向上的变动需求的问题。而工厂设计模式的存在是为了解决哪一方面的问题呢?或者说它的动机是什么呢?工厂模式的动机在软件系统中,经常面临着“某个对象”的创建工作;由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口。如何应对这种变化?如何提供一种“封装机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖该对象的对象”不随着需求改变而改变?不同类型的工厂简单工厂工厂方法模式抽象工厂场景1—麦当劳的汉堡种类多请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用FactoryMethod模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。简单工厂模式简单工厂模式是创建型模式,用于对象的创建,它不属于23种gof设计模式。它是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。简单工厂模式的结构模式的结构中包括的角色:抽象产品(Product)具体产品(ConcreteProduct)构造者(Creator)简单工厂模式的类图简单工厂模式示例//Window是抽象产品,WindowBig&WindowSmall是具体产品publicabstractclassWindow{publicabstractvoidfunc();}publicclassWindowBigextendsWindow{publicvoidfunc(){System.out.println(ThisisBigWindow!);}}publicclassWindowSmallextendsWindow{publicvoidfunc(){System.out.println(ThisisSmallWindow!);}}简单工厂模式示例//工厂类publicclassFactory{publicWindowCreateWindow(Stringtype){if(type.equals(Big)){returnnewWindowBig();}elseif(type.equals(Small)){returnnewWindowSmall();}else{returnnewWindowBig();}}简单工厂模式示例//TheMainfunctiononlyforourtestpublicstaticvoidmain(String[]args){FactorymyFactory=newFactory();WindowmyBigWindow=myFactory.CreateWindow(Big);myBigWindow.func();WindowmySmallWindow=myFactory.CreateWindow(Small);mySmallWindow.func();}}简单工厂模式优缺点优点:简单工厂模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。简单工厂模式的使用场景工厂类负责创建的对象比较少客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用场景2—去哪里吃鸡翅追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说来四个鸡翅就行了。麦当劳和肯德基就是生产鸡翅的Factory工厂方法模式工厂方法模式(别名:虚拟构造)定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。工厂方法模式模式的结构中包括的四种角色:抽象产品(Product)具体产品(ConcreteProduct)构造者(Creator)具体构造者(ConcreteCreator)工厂方法模式类图工厂方法模式示例1.抽象产品(Product):PenCore.javapublicabstractclassPenCore{Stringcolor;publicabstractvoidwriteWord(Strings);}工厂方法模式示例2.具体产品(ConcreteProduct)_1:RedPenCore.javapublicclassRedPenCoreextendsPenCore{RedPenCore(){color=红色;}publicvoidwriteWord(Strings){System.out.println(写出+color+的字:+s);}}工厂方法模式示例3.构造者(Creator):BallPen.javapublicabstractclassBallPen{BallPen(){System.out.println(生产了一只装有+getPenCore().color+笔芯的圆珠笔);}publicabstractPenCoregetPenCore();//工厂方法}工厂方法模式示例4.具体构造者(ConcreteCreator):RedBallPen.javapublicclassRedBallPenextendsBallPen{publicPenCoregetPenCore(){returnnewRedPenCore();}}BlueBallPen.javapublicclassBlueBallPenextendsBallPen{publicPenCoregetPenCore(){returnnewBluePenCore();}}BlackBallPen.javapublicclassBlackBallPenextendsBallPen{publicPenCoregetPenCore(){returnnewBlackPenCore();}}工厂方法模式示例5.应用Application.javapublicclassApplication{publicstaticvoidmain(Stringargs[]){PenCorepenCore;BallPenballPen=newBlueBallPen();penCore=ballPen.getPenCore();penCore.writeWord(你好,很高兴认识你);ballPen=newRedBallPen();penCore=ballPen.getPenCore();penCore.writeWord(Howareyou);ballPen=newBlackBallPen();penCore=ballPen.getPenCore();penCore.writeWord(nicetomeetyou);}}工厂方法模式工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。工厂方法模式的优点这种抽象的结果,使这种工厂方法模式可以用来允许系统不修改具体工厂角色的情况下引进新产品,这一特点无疑使得工厂模式具有超过简单工厂模式的优越性。场景3—地点及食物的选择MM既喜欢吃汉堡又喜欢吃鸡翅,麦当劳和肯德基都有不同口味的鸡翅和不同口味的汉堡,但不管你带MM去麦当劳或肯德基,只管让MM向服务员说她喜欢吃的食物就OK了抽象工厂模式抽象工厂模式(别名:配套kit)提供一个创建一系列或相互依赖对象的接口,而无需指定它们具体的类。产品族所谓产品族,是指位于不同产品等级结构,功能相关联的产品组成的家族。如图:产品族图中一共有四个产品族,分布于三个不同的产品等级结构中。只要指明一个产品所处的产品族以及它所属的等级结构,就可以唯一的确定这个产品。为什么需要抽象工厂使用抽象工厂可以做到一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。而工厂方法模式所建工厂只能生产一个等级结构中的一种对象。抽象工厂模式类图抽象工厂示例1.抽象产品(Product):UpperClothes.javapublicabstractclassUpperClothes{publicabstractintgetChestSize();publicabstractintgetHeight();publicabstractStringgetName();}Trousers.javapublicabstractclassTrousers{publicabstractintgetWaistSize();publicabstractintgetHeight();publicabstractStringgetName();}抽象工厂示例2.具体产品(ConcreteProduct)_1:WesternUpperClothes.javapublicclassWesternUpperClothesextendsUpperClothes{privateintchestSize;privateintheight;privateStringname;WesternUpperClothes(Stringname,intchestSize,intheight){this.name=name;this.chestSize=chestSize;this.height=height;}publicintgetChestSize(){returnchestSize;}publicintgetHeight(){returnheight;}publicStringgetName(){returnname;}}抽象工厂示例2.具体产品(ConcreteProduct)_2:CowboyUpperClothes.javapublicclassCowboyUpperClothesextendsUpperClothes{privateintchestSize;privateintheight;privateStringname;CowboyUpperClothes(Stringname,intchestSize,intheight){this.name=name;this.chestSize=chestSize;this.height=height;}publicintgetChestSize(){returnchestSize;}publicintgetHeight(){returnheight;}publicStringgetName(){returnname;}}抽象工厂示例2.具体产品(ConcreteProduct)_3:WesternTrousers.javapublicclassWesternTrousersextendsTrousers{privateintwaistSize;privateintheight;privateStringname;WesternTrousers(Stringname,intwaistSize,intheight){this.name=name;this.waistSize=waistSize;this.height=height;}publicintgetWaistSize(){r
本文标题:工厂模式
链接地址:https://www.777doc.com/doc-5382967 .html