第五章 抽象工厂模式
1.1 简介
抽象工厂模式的定义:抽象工厂模式提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
举例: 工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。
用 OOP 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。
抽象工厂的类图如图所示:
1.2 抽象工厂模式——Pizza实例
继第四章通过工厂方法实现Pizza对象的创建,本章继续以Pizza对象创建为例,每种Pizza都需要若干种原料才能创建,每种Pizza需要Clams、Dough、Cheese、Pepperoni、Sauce等不同原料,Pizza是最终产品,每一种原料又有不同类型,所以将不同原料申明为接口,某种风格口味的原料工厂负责生产一系列具体原料,设计方案如图所示。
NYPizzaStore 是客户代码,依赖原料工厂PizzaIngredientFactory生产一系列原料,不同风格口味的原料工厂ChicagoPizzaIngredientFactory和NYPizzaIngredientFactory实现抽象的原料工厂PizzaIngredientFactory,负责实现具体的一族原料。
部分代码:
PizzaIngredientFactory类
PizzaIngredientFactory定义了一个接口,用于创建原料家族,并且没有明确指定原料具体的类。
package headfirst.designpatterns.abstractfactory;
public interface PizzaIngredientFactory {
public Dough createDough();
public Sauce createSauce();
public Cheese createCheese();
public Veggies[] createVeggies();
public Pepperoni createPepperoni();
public Clams createClam();
}
ChicagoPizzaIngredientFactory 类:生产Chicago风味Pizza所需的具体原料。
package headfirst.designpatterns.abstractfactory;
public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {
public Dough createDough() {
return new ThickCrustDough();
}
public Sauce createSauce() {
return new PlumTomatoSauce();
}
public Cheese createCheese() {
return new MozzarellaCheese();
}
public Veggies[] createVeggies() {
Veggies veggies[] = { new BlackOlives(),
new Spinach(),
new Eggplant() };
return veggies;
}
public Pepperoni createPepperoni() {
return new SlicedPepperoni();
}
public Clams createClam() {
return new FrozenClams();
}
}
NYPizzaIngredientFactory类:生产New York风味Pizza所需的具体原料。
package headfirst.designpatterns.abstractfactory;
public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
public Dough createDough() {
return new ThinCrustDough();
}
public Sauce createSauce() {
return new MarinaraSauce();
}
public Cheese createCheese() {
return new ReggianoCheese();
}
public Veggies[] createVeggies() {
Veggies veggies[] = { new Garlic(), new Onion(), new Mushroom(), new RedPepper() };
return veggies;
}
public Pepperoni createPepperoni() {
return new SlicedPepperoni();
}
public Clams createClam() {
return new FreshClams();
}
}
1.3 总结
对比工厂方法和抽象工厂:
工厂方法:
抽象工厂:
区别或共同之处:
- 抽象工厂与工厂方法都是负责创建对象,工厂方法是通过对象的组合,工厂方法创建对象,需要扩展一个类,并覆盖它的工厂方法,由子类创建对象,抽象工厂提供一个用来创建产品家族的接口,这个接口的子类定义了产品被产生的方法。
- 工厂方法和抽象工厂都将客户从具体类型中解耦。
- 抽象工厂创建一系列产品,需要一个很大的接口,而工厂方法创建一个产品,只需要一个方法就可以了。
GitHub地址:https://github.com/SJMP1573/DesignPatterns
参考
[1] Freeman E. Head First 设计模式[M] 中国电力出版社.
[2] 菜鸟教程.