我是从一个网站阅读设计模式
在那里,我读到厂,工厂方法和抽象工厂,但他们是如此混乱,我不是在定义明确。 根据定义
厂 - 创建对象,而不实例化逻辑暴露于在客户端和通过一个公共接口是指新创建的对象。 是工厂方法的简化版本
工厂方法 - 通过一个界面,用于创建对象,让子类来决定哪一个类实例,并通过一个共同的接口是指新创建的对象。
抽象工厂 - 信息的界面,用于创建一个家庭相关的对象,但没有明确指定其类。
我也看了关于抽象工厂VS工厂方法的其他计算器线程,但UML图绘制有使我的理解更是雪上加霜。
谁能告诉我
- 如何在这三种模式各不相同?
- 当要使用哪个?
- 而且如果可能的话,任何Java例子涉及到这些模式?
Answer 1:
所有这三种类型的工厂做同样的事情:他们是一个“聪明的构造函数”。
比方说,你希望能够创建两个种类的水果:苹果和橘子。
厂
厂是“固定”的,因为你只有一个实现无子类。 在这种情况下,你将有一个这样的类:
class FruitFactory {
public Apple makeApple() {
// Code for creating an Apple here.
}
public Orange makeOrange() {
// Code for creating an orange here.
}
}
使用案例:构建一个苹果或橘子是有点太复杂的构造函数或者处理。
工厂方法
工厂方法通常用于当你在一个类中的一些通用的处理,但想要改变你实际使用哪种水果。 所以:
abstract class FruitPicker {
protected abstract Fruit makeFruit();
public void pickFruit() {
private final Fruit f = makeFruit(); // The fruit we will work on..
<bla bla bla>
}
}
...那么你就可以重复使用的通用功能FruitPicker.pickFruit()
通过实现在子类工厂方法:
class OrangePicker extends FruitPicker {
@Override
protected Fruit makeFruit() {
return new Orange();
}
}
抽象工厂
抽象工厂通常用于诸如依赖注入/策略,当你希望能够创建一个需要“同种”的对象的整个家庭,以及有一些共同的基类。 这里有一个模糊的水果相关的例子。 这里使用的情况是,我们要确保我们不小心在苹果使用OrangePicker。 只要在我们得到我们的水果和选择器从相同的工厂,他们都会匹配。
interface PlantFactory {
Plant makePlant();
Picker makePicker();
}
public class AppleFactory implements PlantFactory {
Plant makePlant() {
return new Apple();
}
Picker makePicker() {
return new ApplePicker();
}
}
public class OrangeFactory implements PlantFactory {
Plant makePlant() {
return new Orange();
}
Picker makePicker() {
return new OrangePicker();
}
}
Answer 2:
- 如何在这三种模式各不相同?
工厂:创建对象,而不实例化逻辑暴露给客户端。
工厂方法:定义一个接口用于创建对象,但是让子类决定哪一个类实例。 工厂方法使一个类的实例化延迟到子类
抽象工厂:提供用于创建相关或依赖的对象,而无需指定它们具体的类的接口。
AbstractFactory模式使用组合物,同时该工厂方法设计模式使用继承和依赖于派生类或子类来创建对象委托创建对象到另一个类的责任
- 当要使用哪个?
工厂:客户端只需要一个类,并不关心其具体实现是越来越。
工厂方法:客户不知道具体的类都将需要在运行时创建的,但只是希望得到一个类,将做的工作。
AbstactFactory:当你的系统有能力创造的产品的多个家庭或你想提供的产品出库没有暴露的实现细节。
抽象工厂类通常与工厂方法来实现。 工厂方法通常被称为模板方法中。
- 而且如果可能的话,任何Java例子涉及到这些模式?
工厂和FactoryMethod
意图:
定义一个接口用于创建对象,但是让子类决定将哪一个类实例。 工厂方法使一个类的实例化延迟到子类。
UML图 :
产品:它定义了工厂方法创建的对象的接口。
ConcreteProduct:实现产品接口
创建者:声明工厂方法
ConcreateCreator:实现工厂方法返回一个ConcreteProduct的实例
问题陈述:通过工厂方法,它定义了游戏界面创建游戏的一个工厂。
代码片段:
工厂模式。 当使用工厂方法?
比较与其他创建型模式:
设计开始就使用工厂方法 (不太复杂的,更加个性化,子类增殖),向抽象工厂,原型,或生成器发展(更灵活,更复杂的)作为设计师发现需要更多的灵活性,在那里
抽象工厂类通常与工厂方法实现的,但他们也可以使用原型实现
进一步阅读参考资料: Sourcemaking设计模式
Answer 3:
工厂 -独立的工厂类来创建复杂的对象。
例如:FruitFactory类创建水果的对象
class FruitFactory{
public static Fruit getFruit(){...}
}
工厂方法 -而不是工厂整个单独的类,刚才那一类本身作为一个工厂添加一个方法。
例如:
Calendar.getInstance() (Java's Calendar)
抽象工厂方法 -厂厂
例如:假设我们要建设工厂的计算机部件。 因此,有几种类型,如笔记本电脑,台式电脑,服务器电脑。
因此,对于每个compter类型,我们需要的工厂。 所以我们创建类似下面的一个工厂的高级工厂
ComputerTypeAbstractFactory.getComputerPartFactory(String computerType) ---> This will return PartFactory which can be one of these ServerPartFactory, LaptopPartFactory, DesktopPartFactory.
现在,这些3本身又是工厂。 (您将处理PartFactory本身,而是在引擎盖下,根据您在抽象工厂提供了哪些会有单独实施)
Interface-> PartFactory. getComputerPart(String s),
Implementations -> ServerPartFactory, LaptopPartFactory, DesktopPartFactory.
Usage:
new ComputerTypeAbstractFactory().getFactory(“Laptop”).getComputerPart(“RAM”)
编辑:编辑提供抽象工厂确切的接口,每个注释中的反对意见。
Answer 4:
每一个设计模式蓬勃发展,以帮助确保写,工作代码没有被触及。 我们都知道,一旦我们接触的工作代码,还有在现有的工作流程的缺陷,和更大量的测试需要完成,以确保我们没有破坏任何东西。
工厂模式基于输入标准创建对象,从而确保你不需要写代码一样,如果这样则创建这个还挺对象要不然这还挺对象。 这方面的一个很好的例子是一个旅游网站。 一个旅游网站,只能提供旅游(飞机,火车,公共汽车)和/或提供酒店和/或提供旅游景点包。 现在,当用户选择未来,该网站需要决定它需要创造什么样的对象。 它应该只创建旅游或酒店的对象了。
现在,如果你设想添加其他网站,你的投资组合,你相信相同的核心来使用,例如,一个拼车网站,现在搜索驾驶室,使在线支付,你可以在你的核心使用抽象工厂。 这样,你可以捕捉在驾驶室和拼车的一个更多的工厂。
这两个工厂无关彼此,所以其良好的设计,让他们在不同的工厂。
现在希望这是明确的。 究其网站再次记住这个例子,希望这会有所帮助。 我真的希望我已经正确地表示模式:)。
Answer 5:
AbstractProductA, A1 and A2 both implementing the AbstractProductA
AbstractProductB, B1 and B2 both implementing the AbstractProductB
interface Factory {
AbstractProductA getProductA(); //Factory Method - generate A1/A2
}
使用工厂方法,用户可以能够创建A1或AbstractProductA的A2。
interface AbstractFactory {
AbstractProductA getProductA(); //Factory Method
AbstractProductB getProductB(); //Factory Method
}
但抽象工厂具有多于1种工厂方法(例如:2工厂方法),使用这些工厂方法,将创建的对象集/相关的对象。 使用抽象工厂,用户可以能够创建A1,AbstractProductA,AbstractProductB的B1对象
文章来源: Design Patterns: Factory vs Factory method vs Abstract Factory