一、定义
抽象工厂模式是工厂方法的进一步深化,在这个模式中的工厂类不单单可以创建一个对象,而是可以创建一组对象。提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。( 每一个具体工厂都提供了一个或多个工厂方法用于产生多种不同类型的产品)。
产品等级和产品族
- 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
- 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。
二、类型
创建型
三、适用场景
- 客户端不需要知道它所依赖的产品类是如何创建的。
- 一系列相关的产品对象(产品族)需要一起被创建。
四、优点
- 客户端只需要知道产品对应的工厂,无需关心其创建细节。
- 将一系列的产品族一起创建。
五、缺点
规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂接口。
六、类图
七、代码实现
产品接口:
package com.wms.createtype.abstractfactory;
public interface Fruit {
void produce();
}
package com.wms.createtype.abstractfactory;
public interface Box {
void produce();
}
产品实现类:
package com.wms.createtype.abstractfactory;
public class Apple implements Fruit {
public void produce() {
System.out.println("生产苹果");
}
}
package com.wms.createtype.abstractfactory;
public class Banana implements Fruit {
public void produce() {
System.out.println("生产香蕉");
}
}
package com.wms.createtype.abstractfactory;
public class AppleBox implements Box{
public void produce() {
System.out.println("生产装苹果的箱子");
}
}
package com.wms.createtype.abstractfactory;
public class BananaBox implements Box {
public void produce() {
System.out.println("生产装香蕉的箱子");
}
}
工厂接口:
package com.wms.createtype.abstractfactory;
public interface Factory {
Fruit getFruit();
Box getBox();
}
工厂实现类:
package com.wms.createtype.abstractfactory;
public class AppleUnPackFactory implements Factory {
public Fruit getFruit() {
return new Apple();
}
public Box getBox() {
return new AppleBox();
}
}
package com.wms.createtype.abstractfactory;
public class BananaUnPackFactory implements Factory {
public Fruit getFruit() {
return new Banana();
}
public Box getBox() {
return new BananaBox();
}
}
客户端:
package com.wms.createtype.abstractfactory;
public class TestDesignPattern {
public static void main(String[] args) {
Factory appleUnPackFactory = new AppleUnPackFactory();
Fruit apple = appleUnPackFactory.getFruit();
Box appleBox = appleUnPackFactory.getBox();
unPack(apple, appleBox);
Factory bananaUnPackFactory = new BananaUnPackFactory();
Fruit banana = bananaUnPackFactory.getFruit();
Box bananaBox = bananaUnPackFactory.getBox();
unPack(banana, bananaBox);
}
public static void unPack(Fruit fruit, Box box) {
fruit.produce();
box.produce();
System.out.println("水果装入箱子");
}
}