目录
1. 抽象工厂模式
1.1 定义、优缺点、使用场景
- 1. 抽象工厂模式
- 1.1 定义、优缺点、使用场景
- 1.2 模式的结构与实现
工厂方法模式只考虑生产同种类的产品,但是现实生活中许多工厂是综合型的工厂,能生产多种类的产品。如工厂既生成收集有生成电脑
抽象工厂模式除了具有工厂方法模式的优点外,其他优点如下:
- 可以在工厂类的内部对多个种类产品共同管理,而不必专门引入多个新的工厂类来进行管理
- 当需要产品时,抽象工厂可以保证客户端始终只使用同一个工厂的产品组
- 抽象工厂增强了程序的可扩展性,当增加一个新的工厂时,不需要修改原代码,满足开闭原则
缺点:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。违法了“开闭原则”
适用场景:
- 当需要创建的对象是一系列相互关联或相互依赖的不同种类产品时,如电器工厂中的电视机、洗衣机、空调等
- 系统中有多个工厂,但每次只使用其中的某一种类产品。如有人只喜欢穿某一个品牌的衣服和鞋
- 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构
结构:
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系
- 抽象工厂(Factory):提供了创建产品的接口,它包含多个创建产品的方法newProduct(),可以创建多个不同种类的产品
- 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建
实现:
public class FactoryTest {
public static void main(String[] args) {
// 可以通过配置文件进行类名的配置,然后实例化对应的具体工厂类
Factory factory = new HuaweiFactory();
Phone phone = factory.newPhone();
phone.show();
Computer computer = factory.newComputer();
computer.show();
}
}
// 抽象产品:手机
interface Phone {
public void show();
}
// 具体产品:华为手机
class HuaweiPhone implements Phone {
public void show() {
System.out.println("华为手机显示");
}
}
// 具体产品:小米手机
class XiaomiPhone implements Phone {
public void show() {
System.out.println("小米手机显示");
}
}
// 抽象产品:电脑
interface Computer {
public void show();
}
// 具体产品:华为电脑
class HuaweiComputer implements Computer {
public void show() {
System.out.println("华为电脑显示");
}
}
// 具体产品:小米电脑
class XiaomiComputer implements Computer {
public void show() {
System.out.println("小米电脑显示");
}
}
// 抽象工厂
interface Factory {
public Phone newPhone();
public Computer newComputer();
}
// 具体工厂:华为工厂
class HuaweiFactory implements Factory {
public Phone newPhone() {
System.out.println("华为工厂生成---华为手机");
return new HuaweiPhone();
}
public Computer newComputer() {
System.out.println("华为工厂生成---华为电脑");
return new HuaweiComputer();
}
}
// 具体工厂:小米工厂
class XiaomiFactory implements Factory {
public Phone newPhone() {
System.out.println("小米工厂生成---小米手机");
return new XiaomiPhone();
}
public Computer newComputer() {
System.out.println("小米工厂生成---小米电脑");
return new XiaomiComputer();
}
}
运行程序,结果如下:
华为工厂生成---华为手机
华为手机显示
华为工厂生成---华为电脑
华为电脑显示