来源:https://en.wikipedia.org/wiki/Factory_method_pattern
该图实际上暗示了工厂方法模式?
为什么我们需要创作者?看一下代码示例:
interface Product{
public String getName();
}
class ConcreteProduct1 implements Product {
@Override
public String getName() {
return "I'm product 1";
}
}
class ConcreteProduct2 implements Product {
@Override
public String getName() {
return "Im product 2!";
}
}
// CREATOR HERE
interface Creator{
public Product createProuct(String productClass);
}
class ConcreteCreator implements Creator{
@Override
public Product createProuct(String productClass) {
if(productClass.equals("1"))
return new ConcreteProduct1();
else if(productClass.equals("2"))
return new ConcreteProduct2();
else
return null; //
}
}
public class Test {
public static void main(String[] args) {
Creator c = new ConcreteCreator();
Product product = c.createProuct("1");
System.out.print(product.getName());
}
}
没有创建者界面的代码:
class ConcreteCreator{
public Product createProuct(String productClass) {
if(productClass.equals("1"))
return new ConcreteProduct1();
else if(productClass.equals("2"))
return new ConcreteProduct2();
else
return null; //
}
}
public class Test{
public static void main(String[] args) {
ConcreteCreator c = new ConcreteCreator();
Product product = c.createProuct("1");
System.out.print(product.getName());
}
}
那为什么我们需要Creator界面?是否以后我会添加另一种工厂方法?如果是,它仍然是工厂方法模式还是抽象工厂模式?你能给我一些带有我的Creator接口扩展和使用两种方法的ConcreteCreator实现的代码示例吗?
通用造物主怎么样?它看起来比许多类型指定的Creators简单得多......:
interface Product{
public String getName();
}
class ConcreteProduct implements Product{
@Override
public String getName() {
return "I'm product 1";
}
}
interface Moveable{
public String move();
}
class Car implements Moveable{
@Override
public String move() {
return "moving...";
}
}
interface Creator<T>{
public T create();
}
class ConcreteCreatorProducts implements Creator<Product>{
@Override
public Product create() {
return new ConcreteProduct();
}
}
class ConcreteCreatorCar implements Creator<Car>{
@Override
public Car create() {
return new Car();
}
}
public class Test{
public static void main(String[] args) {
Creator<Product> productCreator = new ConcreteCreatorProducts();
Product product = productCreator.create();
Creator<Car> carCreator = new ConcreteCreatorCar();
Car car = carCreator.create();
}
}
答案 0 :(得分:1)
在您的示例中,您不需要Creator界面,除非您想要多个实现并在它们之间进行交换。但该图实际上描述的模式与您实施的模式略有不同。
描述工厂方法模式的方式基于原始设计模式书。今天有点奇怪,因为它使用子类来配置类,当我们鼓励使用组合时。因此,该图确实显示了工厂方法模式,但与其在许多其他地方描述的方式不同。
工厂方法模式是:
定义用于创建对象的接口,但让子类决定 要实例化的类。 Factory方法允许类延迟 它用于子类的实例化。
在原始模式中,Creator
不是一个界面。通过&#39;接口&#39;,它们表示Creator
定义的工厂方法,而不是像Java那样的接口。
工厂方法不需要参数。不是基于参数返回不同的类型,而是根据创建的子类返回不同的类型。
此外,您不会从createProduct
拨打main
,而是从Creator
内的方法拨打Creator
。 MazeGame
是工厂方法的用户,因此它定义了一个可能是抽象的工厂方法,以及一些使用该方法的方法。
请参阅维基百科页面上的Java示例。 Creator
类是anOperation
。构造函数用作!empty()
方法,并且有多个子类用于创建不同类型的房间。
答案 1 :(得分:0)
编写代码以便人类读者理解它。
这意味着您作为程序员有时会使用该语言的方式,因为它绝对是强制性的,但因为它是传达意图的最佳方式。
一旦你声明某个东西是接口,你就会明确表示没有“基类” - 只有一个接口,并且任何特定的实现都是微妙的细节对人们来说并不重要处理相应的对象。
换句话说:是的,完全可以实现工厂模式,其中负责创建实际对象的部分不是接口,而是固定类。特别是当考虑“内部”工厂(没有暴露于公共API和广泛的“不同”最终用户)时,这种情况甚至可能是更常见的方法。 (我编写的代码包含许多工厂,其中很少有人会遵循上述“接口”几乎所有的方法)
除此之外 - 请记住,编程通常也是关于不同需求之间的平衡。示例:您可能(再次用于通信 intent )决定声明一个提供某种功能的类 final 。所以没有人知道扩展那个特定的类。但这样做意味着该API的用户在选择模拟框架时会突然受到影响。由于模拟最终类不是您可以轻松完成的事情。如果您正在使用此API,并且想要编写单元测试 - 那么您很高兴公共API依赖于接口,而不是类。因为你总是可以模拟接口 - 但正如所说的那样,最终的类会引起头痛。