猿问
下载APP

设计模式:工厂与工厂方法与抽象工厂

设计模式:工厂与工厂方法与抽象工厂

我正在从网站上阅读设计模式

在那里我读到了有关工厂,工厂方法和抽象工厂的信息,但它们很混乱,我对定义并不清楚。根据定义

Factory - 创建对象而不将实例化逻辑暴露给客户端,并通过公共接口引用新创建的对象。是Factory Method的简化版本

工厂方法 - 定义用于创建对象的接口,但让子类决定实例化哪个类,并通过公共接口引用新创建的对象。

抽象工厂 - 提供用于创建相关对象族的界面,而无需明确指定其类。

我还查看了关于抽象工厂与工厂方法的其他stackoverflow线程,但是那里绘制的UML图使我的理解更加糟糕。

有谁能告诉我

  1. 这三种模式如何相互不同?

  2. 什么时候用哪个?

  3. 如果可能的话,任何与这些模式相关的java示例?


白板的微信
浏览 62回答 3
3回答

慕神8447489

所有三种工厂类型都做同样的事情:它们是“智能构造函数”。假设您希望能够创建两种水果:Apple和Orange。厂工厂是“固定的”,因为你只有一个没有子类化的实现。在这种情况下,您将拥有这样的类:class&nbsp;FruitFactory&nbsp;{ &nbsp;&nbsp;public&nbsp;Apple&nbsp;makeApple()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Code&nbsp;for&nbsp;creating&nbsp;an&nbsp;Apple&nbsp;here. &nbsp;&nbsp;} &nbsp;&nbsp;public&nbsp;Orange&nbsp;makeOrange()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Code&nbsp;for&nbsp;creating&nbsp;an&nbsp;orange&nbsp;here. &nbsp;&nbsp;}}使用案例:构造Apple或Orange有点太复杂,无法在构造函数中处理。工厂方法工厂方法通常用于在类中进行一些通用处理,但想要改变实际使用的水果类型。所以:abstract&nbsp;class&nbsp;FruitPicker&nbsp;{ &nbsp;&nbsp;protected&nbsp;abstract&nbsp;Fruit&nbsp;makeFruit(); &nbsp;&nbsp;public&nbsp;void&nbsp;pickFruit()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;Fruit&nbsp;f&nbsp;=&nbsp;makeFruit();&nbsp;//&nbsp;The&nbsp;fruit&nbsp;we&nbsp;will&nbsp;work&nbsp;on.. &nbsp;&nbsp;&nbsp;&nbsp;<bla&nbsp;bla&nbsp;bla> &nbsp;&nbsp;}}...然后,您可以FruitPicker.pickFruit()通过在子类中实现工厂方法来重用通用功能:class&nbsp;OrangePicker&nbsp;extends&nbsp;FruitPicker&nbsp;{ &nbsp;&nbsp;@Override &nbsp;&nbsp;protected&nbsp;Fruit&nbsp;makeFruit()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;Orange(); &nbsp;&nbsp;}}抽象工厂抽象工厂通常用于依赖注入/策略之类的东西,当你想要能够创建一整套需要“同类”的对象时,并且有一些共同的基类。这是一个与水果有关的模糊例子。这里的用例是我们要确保我们不会在Apple上意外使用OrangePicker。只要我们从同一家工厂获得我们的水果和采摘器,他们就会匹配。interface&nbsp;PlantFactory&nbsp;{ &nbsp;&nbsp;Plant&nbsp;makePlant(); &nbsp;&nbsp;Picker&nbsp;makePicker();&nbsp;}public&nbsp;class&nbsp;AppleFactory&nbsp;implements&nbsp;PlantFactory&nbsp;{ &nbsp;&nbsp;Plant&nbsp;makePlant()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;Apple(); &nbsp;&nbsp;} &nbsp;&nbsp;Picker&nbsp;makePicker()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;ApplePicker(); &nbsp;&nbsp;}}public&nbsp;class&nbsp;OrangeFactory&nbsp;implements&nbsp;PlantFactory&nbsp;{ &nbsp;&nbsp;Plant&nbsp;makePlant()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;Orange(); &nbsp;&nbsp;} &nbsp;&nbsp;Picker&nbsp;makePicker()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;OrangePicker(); &nbsp;&nbsp;}}

呼唤远方

这三种模式如何相互不同?Factory:创建对象而不将实例化逻辑暴露给客户端。工厂方法:定义用于创建对象的接口,但让子类决定实例化哪个类。Factory方法允许类将实例化延迟到子类抽象工厂:提供用于创建相关或从属对象族的接口,而无需指定其具体类。AbstractFactory模式使用组合将创建对象的责任委托给另一个类,而Factory方法设计模式使用继承并依赖派生类或子类来创建对象什么时候用哪个?工厂:客户只需要一个类,而不关心它正在实现哪个具体实现。工厂方法:客户端不知道在运行时需要创建哪些具体类,但只想获得一个可以完成工作的类。AbstactFactory:&nbsp;当您的系统必须创建多个系列的产品或您想要提供产品库而不暴露实现细节时。抽象工厂类通常使用Factory Method实现。工厂方法通常在模板方法中调用。如果可能的话,任何与这些模式相关的java示例?工厂和工厂方法意图:定义用于创建对象的接口,但让子类决定实例化哪个类。Factory Method允许类将实例化延迟到子类。UML图:Product:它定义Factory方法创建的对象的接口。ConcreteProduct:实现产品界面创建者:声明工厂方法ConcreateCreator:&nbsp;实现Factory方法以返回ConcreteProduct的实例问题陈述:使用工厂方法创建游戏工厂,工厂方法定义游戏界面。代码段:工厂模式。何时使用工厂方法?与其他创作模式比较:设计从使用工厂方法(不太复杂,可定制,子类增加)开始,并逐渐向Abstract Factory,Prototype或Builder发展(更灵活,更复杂),因为设计师发现需要更多灵活性的地方抽象工厂类通常使用工厂方法实现,但也可以使用Prototype实现进一步阅读的参考资料:源代码设计模式

忽然笑

Factory&nbsp;- 用于创建复杂对象的Separate Factory类。例:FruitFactory类创建Fruit的对象class&nbsp;FruitFactory{public&nbsp;static&nbsp;Fruit&nbsp;getFruit(){...}}工厂方法&nbsp;- 而不是工厂的整个单独类,只需在该类中添加一个方法作为工厂。例如:Calendar.getInstance()&nbsp;(Java's&nbsp;Calendar)抽象工厂方法&nbsp;- 工厂工厂例如:让我们说我们想建立电脑零件工厂。因此有几种类型的计算机,如笔记本电脑,台式机,服务器。因此,对于每种计算机类型,我们需要工厂。因此,我们创建了一个高层工厂,如下所示ComputerTypeAbstractFactory.getComputerPartFactory(String&nbsp;computerType)&nbsp;--->&nbsp;This&nbsp;will&nbsp;return&nbsp;PartFactory&nbsp;which&nbsp;can&nbsp;be&nbsp;one&nbsp;of&nbsp;these&nbsp;ServerPartFactory,&nbsp;LaptopPartFactory,&nbsp;DesktopPartFactory.现在这3个本身又是工厂。(您将处理PartFactory本身,但在引擎盖下,将根据您在抽象工厂中提供的内容进行单独实现)&nbsp;&nbsp;Interface->&nbsp;PartFactory.&nbsp;getComputerPart(String&nbsp;s),&nbsp;Implementations&nbsp;->&nbsp;ServerPartFactory,&nbsp;LaptopPartFactory,&nbsp;DesktopPartFactory.Usage:new&nbsp;ComputerTypeAbstractFactory().getFactory(“Laptop”).getComputerPart(“RAM”)编辑:根据评论中的异议编辑,为抽象工厂提供精确的界面。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答