简单工厂模式
class SimplePizzaFactory{
public Pizza createPizza() {
return new Pizza();
}
}
这便是最简单的工厂模式,可以将这个返回对象的方法设置为static的,常称为静态工厂方法(通常都设置为静态的)。
简单工厂模式实际上并不是真正意义上的工厂模式。
真正的工厂模式
工厂方法
通过让子类决定该创建对象是什么,来达到将对象创建的过程封装的目的。
创建对象的是一个方法,这个创建对象的方法在父类中是一个抽象方法,需要子类覆盖具体实现创建什么对象。
abstract class PizzaStore{
// 订单方法,子类都需要使用该方法
public Pizza orderPizza(String type){
Pizza pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
// 工厂方法,创建对象交给该方法
protected abstract Pizza createPizza(String type);
}
这个抽象类中有一个抽象方法Pizza createPizza(String type);
将对象创建的工作交给这个抽象方法,接下来具体的Pizza店可以根据自己做的Pizza来创建自己的Pizza,并且可以使用不用变化的订单方法orderPizza
。这样就达到了:让子类决定该创建对象是什么,这也是工厂模式的核心。
抽象工厂
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
抽象工厂也就是建立一个抽象类或者接口,里边包含同一类型的类的创建,使用具体的类实现接口中的这些方法,创建对应类。
抽象工厂与工厂方法相比优点:就是可以把一群相关的产品集合起来。
// 这个接口的作用就是用来提供创建一个产品家族的抽象类型,
// 这个类型的子类定义了产品被生产的方法
interface PizzaIngredientFactory{
public Dough createDough();
public Sauce createSauce();
public Cheese createCheese();
}
class NYFactory implements PizzaIngredientFactory{
// 实现接口的具体方法,这里只写了一个
public Dough createDough(){
return new Dough();
}
...
}