- 定义:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类
- 原则:要依赖抽象,不要依赖具体类
通俗的理解就是,需要在代码中创建某个类的各种子类,每次都需要关键字new来创建,带来的问题是当类变化时,那么散落各处的代码维护起来不方便,这个时候就需要统一管理这些类的创建,那么就有了工厂的概念。
来看一个简单的代码:
public class SimplePizzaFactory{
public Pizza creatPizza(String type){
Pizza pizza = null;
if("cheese".equals(type)){
pizza = new CheesePizza();
}else if("pepperoni".equals(type)){
pizza = new PeppernoiPizza();
}else if("clam".equals(type)){
pizza = new ClamPizza();
}
return pizza;
}
}
这是从书上拿过来的一段代码,将Pizza类的对象创建工作都集中在这里进行,只要传递一个类型参数就可以得到对应类型的对象实例。
再来看下怎么使用这个工厂类:
public class PizzaStore{
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory){this.factory=factory;}
public Pizza orderPizza(String type){
Pizza pizza = factory.createPizza(type);
pizza.method();//接口中定义的一些方法。。。
return pizza;
}
}
是不是很简单呢?这就是常说的”简单工厂“,但这不是设计模式,更像是一种编程习惯,下面就来见识下真正的工厂模式。
示例:
public abstract class PizzaStore{
public Pizza orderPizza(String type){
Pizza pizza = createPizza(type);
pizza.method();
return pizza;
}
abstract Pizza createPizza(String type);
}
上面定义了一个PizzaStore类的超类,子类继承超类然后实现其中的抽象方法,也就是说不同的子类可以根据方法的实现不同来创建不同类型的对象。
比如:
public class NYPizzaStore extends PizzaStore{
Pizza createPizza(String type){
if("cheese".equals(type)){
return new NYCheesePizza();
}else if("pepperoni".equals(type)){
return new NYPeppernoiPizza();
}else if("clam".equals(type)){
return new NYClamPizza();
}
}
}
public class CHPizzaStore extends PizzaStore{
Pizza createPizza(String type){
if("cheese".equals(type)){
return new CHCheesePizza();
}else if("pepperoni".equals(type)){
return new CHPeppernoiPizza();
}else if("clam".equals(type)){
return new CHClamPizza();
}
}
}
上面就时根据之前定义的超类实现的两个PizzaStore的子类,每个子类中分别实现了超类中的抽象方法返回了各自对应需要的Pizza类型。
来看看怎么用:
public class PizzaTest{
public static void main(String args[]){
PizzaStore nyStore = new NYPizzaStore();
PizzaStore chStore = new CHPizzaStore();
Pizza nyPizza = nyStore.orderPizza("cheese");
Pizza chPizza = chStore.orderPizza("cheese");
}
}
以上这些就是一个工厂模式的简单示例。
实际中应用比较多,比如数据库连接技术。
参考书籍:《Head First设计模式》 作者:Eric Freeman&Elsabeth Freeman&Kathy Sierra&Bert Bates
菜鸟手书,欢迎指正!