工厂方式是模板方法的一个特例
工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。
工厂方法让类的实例化推迟到子类
// Creator是一个类,它实现了所有操纵产品的方法,但不实现工厂方法
public abstract class Creator{
void anOperation(){
// ...
}
// Creator的所有子类都必须实现这个抽象的factoryMethod()方法
abstract void factoryMethod();
}
// 具体的创建者
public class ConcreteCreator extends Creator{
// ConcreteCreator实现了factoryMethod(),以实际制造出产品。
@Override
void factoryMethod() {
// ...
}
}
// 所有产品必须实现这个接口,这样一来,
// 使用这些产品的类就可以引用这个接口,而不是具体的类
public abstract class Product{
void operation(){
// ...
}
}
// 具体的产品
public class ConcreteProduct extends Product{
}
public abstract class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = createPizza(type);//根据参数的类型制作不同类型的披萨
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
protectd abstract Pizza createPizza(String type);
//工厂方法用来处理对象的创建,并将这样的行为封装在子类中,这样超类的代码和子类对象创建代码解耦了
}
public class NYPizzaStore extends PizzaStore {
Pizza createPizza(String type) {
if (type.equals("cheese")) {
return new ClassA();
}
//、、、、、
}
}
依赖倒置原则:要依赖抽象,不要依赖具体类。
遵循依赖倒置原则的指导方针:
1、变量不可以持有具体类的引用
如果使用new,就会持有具体类的引用。你可以改用工厂来避开这样的做法。
2、不要让类派生自具体类
如果派生自具体类,你就会依赖具体类。请派生自一个抽象(接口或抽象类)。
3、不要覆盖基类中已实现的方法
如果覆盖基类已实现的方法,那么你的基类就不是一个真正适合被继承的抽象。基类中已实现的方法,应该由所有的子类共享。
参考:
《head first 设计模式》