简单工厂模式:
使用工厂处理创建对象的细节。
其实它并非一个真正的设计模式,而是一种编程习惯。
例如:

若菜单改变则实例化过程需要修改,若菜单一再改变,则需要不断修改,不符合OO原则。所以简单工厂“模式”的做法是创建一个新的对象,叫做“工厂(factory)”来存储处理创建对象的细节。
改为:
public class SimplePizzaFactory {
public Pizza createPizza(String type) {
Pizza pizza = null;
if (type.equals("cheese")) {
pizza = new CheesePizza();
} else if (type.equals("pepperoni")) {
pizza = new PepperoniPizza();
} else if (type.equals("clam")) {
pizza = new ClamPizza();
} else if (type.equals("veggie")) {
pizza = new VeggiePizza();
}
return pizza;
}
}
public class PizzaStore {
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory) {
this.factory = factory;
}
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = factory.createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
UML类图:

工厂方法:
处理对象的创建,并将这样的行为封装在子类中。这样,父类的代码和子类对象创建代码就解耦了。
Abatract Product factoryMethod(String type)
- 工厂方法是抽象的,依赖子类来具体创建对象。
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;
}
}
在不同的pizza店(子类)里具体地实现createPizza方法(工厂方法):
public class ChicagoPizzaStore extends PizzaStore {
Pizza createPizza(String item) {
if (item.equals("cheese")) {
return new ChicagoStyleCheesePizza();
} else if (item.equals("veggie")) {
return new ChicagoStyleVeggiePizza();
} else if (item.equals("clam")) {
return new ChicagoStyleClamPizza();
} else if (item.equals("pepperoni")) {
return new ChicagoStylePepperoniPizza();
} else return null;
}
}
工厂方法模式的定义:工厂模式用于封装对象的创建,让子类进行具体的对象创建,来达到将对象创建的过程封装的目的。
工厂模式的正式定义:
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
UML类图:

(与实例相对应,Product为
Pizza
,Creator为PizzaStore
,factoryMethod()方法为createPizza()
方法。)
抽象工厂模式:
定义:
提供一个接口,用来创建相关或依赖对象的家族,而不需要明确指定具体类。
允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产出的具体产品是什么。
UML类图:

实例类图:

PizzaIngredientFactory
为定义的抽象工厂定义的接口,NYPizzaIngredientFactory
是抽象工厂接口的一个具体实现,NYPizzaStore
是一个客户,客户代码中仅设计抽象工厂,实例化了它的一个具体实现,通过这个具体实现来决定一个pizza的具体配方。
PizzaIngredientFactory ingredientFactory =
new NYPizzaIngredientFactory();
(节选自NYPizzaStore.java)
对比:
工厂方法和抽象工厂模式把都可以把特定实现从应用程序中解耦,但是具体的实现过程是不一样的。
在创建对象的时候前者使用的是类的继承,而后者使用的是组合。
本章要点:
- 所有工厂都是用来封装对象的创建。
- 简单工厂不是一种真正的模式。
- 工厂方法是子类实现工厂方法来创建对象。
- 抽象工厂使用对象的组合来创建对象,在工厂接口所暴露出来的方法中实现对象的创建。
- 依赖倒置原则,避免依赖具体类型,尽量依赖抽象。
网友评论