说明
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。
应用场景
- 一个系统要独立于它的产品的创建、组合和表示时。
- 一个系统要由多个产品系列中的一个来配置时。
- 需要强调一系列相关的产品对象的设计以便进行联合使用时。
- 提供一个产品类库,而只想显示它们的接口而不是实现时。
模式特征
- 多个抽象产品类——Computer、Phone
- 多个具体产品类——LenovoComputer、HuaWeiComputer、LenovoPhone、HuaWeiPhone
- 抽象工厂类-声明(一组)返回抽象产品的方法——Factory
- 具体工厂类-生成(一组)具体产品——LenovoFactory、HuaWeiFactory
工厂方法模式与抽象工厂模式基本类似,可以这么理解:当工厂只生产一个产品的时候,即为工厂方法模式;而工厂如果生产两个或以上的商品为抽象工厂模式。
UML
代码实现
- 抽象产品类一
public interface Computer {
void computerInfo();
}
- 抽象产品类二
public interface Phone {
void phoneInfo();
}
- 具体产品类0_1
public class LenovoComputer implements Computer {
public void computerInfo() {
System.out.println("我是联想电脑");
}
}
- 具体产品类0_2
public class HuaWeiComputer implements Computer {
public void computerInfo() {
System.out.println("我是华为电脑");
}
}
- 具体产品类1_1
public class LenovoPhone implements Phone {
public void phoneInfo() {
System.out.println("我是联想手机");
}
}
- 具体产品类1_2
public class HuaWeiPhone implements Phone {
public void phoneInfo() {
System.out.println("我是华为手机");
}
}
- 抽象工厂类
public interface Factory {
Computer generateComputer();
Phone generatePhone();
}
- 具体工厂类一
public class LenovoFactory implements Factory {
public Computer generateComputer() {
return new LenovoComputer();
}
public Phone generatePhone() {
return new LenovoPhone();
}
}
- 具体工厂类二
public class HuaWeiFactory implements Factory {
public Computer generateComputer() {
return new HuaWeiComputer();
}
public Phone generatePhone() {
return new HuaWeiPhone();
}
}
- 客户端测试类
public class Client {
public static void main(String[] args) {
Factory lenovoFactory = new LenovoFactory();//生产哪个品牌产品由客户决定
//电脑
Computer computer = lenovoFactory.generateComputer();
computer.computerInfo();
//手机
Phone phone = lenovoFactory.generatePhone();
phone.phoneInfo();
}
}
优缺点
- 优点:代码解耦,实现多个产品,很好的满足开闭原则,对复杂对象的生产灵活易扩展。
- 缺点:扩展产品族相当麻烦,而扩展产品族会违反开闭原则,因为要修改所有的工厂。由于抽象工厂模式时工厂方法模式的扩展,很笨重。