工厂方法(Factory Method):工厂方法模式属于类的创建型模式。在工厂方法模式中,父类负责定义创建产品对象的工厂接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实例化哪一个类。
abstract Product factoryMethod(String type)
abstract:工厂方法是抽象的,依赖子类来处理对象的创建
Product:工厂方法返回一个产品,超类中定义的方法,通常使用到工厂方法的返回值
String:工厂方法可能需要参数来指定所要的产品
工厂方法的元素有:
A)创建者类:一个抽象的创建者类,它定义一个抽象的创建者类,它定义了一个抽象的方法,让子类实现此方法制造产品;创建者通常会包含依赖于抽象产品的代码,而这些抽象产品由子类制造,创建者不需要真的知道制造哪种具体产品;多个能够产生产品的具体类,
由于产品是在具体类实现的,所以具体类可以创建具有自己特色的产品。
B)产品类:一个抽象产品, 多个具体产品;
工厂方法模式应用场景:
1.当一个类不知道它所必须创建的对象的类的时候
2.当一个类希望由它的子类来指定它所创建的对象的时候
3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将那一个帮助子类是代理者这一信息局部化的时候
工厂方法相较于简单工厂模式的有点:
a)工厂方法相较于简单工厂模式,工厂方法更符合开放-封闭原则。
b)工厂方法模式实现时,客户端需要决定实例化哪个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码进行,想要增加功能,简单工厂是修改工厂类,而工厂方法模式修改的是客户端。
一抽象产品类派生出多个具体产品类;一抽象工厂类派生出多个具体工厂类;每个具体工厂类只创建一个具体产品类的实例。
以披萨店为例子,PizzaStore为披萨总店(父类), NYPizzaStore为纽约披萨分店(子类)
以下是它的UML图
public abstract class PizzaStore {
abstract Pizza createPizza(String item);
public Pizza orderPizza(String type) {
Pizza pizza = createPizza(type);
System.out.println("--- Making a " + pizza.getName() + " ---");
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
工厂方法模式:披萨总店有两个方法,一个是创建对象的createPizza,createPizza()是抽象方法,只有在子类实现具体的类型。
public class NYPizzaStore extends PizzaStore {
Pizza createPizza(String item) {
if (item.equals("cheese")) {
return new NYStyleCheesePizza();
} else if (item.equals("veggie")) {
return new NYStyleVeggiePizza();
} else if (item.equals("clam")) {
return new NYStyleClamPizza();
} else if (item.equals("pepperoni")) {
return new NYStylePepperoniPizza();
} else return null;
}
}
工厂方法模式:在子类中必须实现createPizza(), 因为它在PizzaStore中是抽象的
由子类全权决定实例化哪个对象。