目录
一 什么是抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
二 什么场景适合使用抽象工厂模式
- 系统只知道产品的接口,而不关心实现。
- 系统要由多个产品系列中的一个来配置的时候。也就是说,可以动态地切换产品簇。
- 要联合使用一系列相关产品的接口。
三 抽象工厂模式的使用示例
3.1 抽象工厂的结构和说明
- AbstractFactory:抽象工厂,定义创建一系列产品对象的操作接口。
- ConcreteFactory:具体的工厂,实现抽象工厂定义的方法,具体实现一系列产品对象的创建。
- AbstractProduct:定义一类产品对象的接口。
- Concrete Product:具体的产品实现对象,通常在具体工厂里面,会选择具体的产品实现对象,来创建符合抽象工厂定义的方法返回的产品类型的对象。
- Client:客户端,主要使用抽象工厂来获取一系列所需要的产品对象,然后面向这些产品对象的接口编程,以实现需要的功能。
3.2 抽象工厂代码实现
(1)抽象工厂代码:
/**
* 抽象工厂的接口
*/
public interface AbstractFactory {
/**
* 创建抽象产品A的对象
* @return 抽象产品A的对象
*/
public AbstractProductA createProductA();
/**
* 创建抽象产品B的对象
* @return 抽象产品B的对象
*/
public AbstractProductB createProductB();
}
(2)产品定义:
/**
* 抽象产品A的接口
*/
public interface AbstractProductA {
//定义抽象产品A相关的操作
}
/**
* 抽象产品B的接口
*/
public interface AbstractProductB {
//定义抽象产品B相关的操作
}
(3)产品的各个实现
产品A的实现
/**
* 产品A的具体实现
*/
public class ProductA1 implements AbstractProductA {
//定义产品A的接口中定义的操作
}
/**
* 产品A的具体实现
*/
public class ProductA2 implements AbstractProductA {
//定义产品A的接口中定义的操作
}
产品B的实现
/**
* 产品B的具体实现
*/
public class ProductB1 implements AbstractProductB {
//定义产品B的接口中定义的操作
}
/**
* 产品B的具体实现
*/
public class ProductB2 implements AbstractProductB {
//定义产品B的接口中定义的操作
}
(4)工厂具体实现
/**
* 具体的工厂实现对象,实现创建具体的产品对象的操作
*/
public class ConcreteFactory1 implements AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ProductB1();
}
}
/**
* 具体的工厂实现对象,实现创建具体的产品对象的操作
*/
public class ConcreteFactory2 implements AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ProductB2();
}
}
(5)客户端的示例代码
public class Client {
public static void main(String[] args) {
//创建抽象工厂对象
AbstractFactory af = new ConcreteFactory1();
//通过抽象工厂来获取一系列的对象,如产品A和产品B
af.createProductA();
af.createProductB();
}
}
四 抽象工厂模式的思考
4.1 抽象工厂的优点
- 分离接口和实现
客户端使用抽象工厂来创建需要的对象,而客户端根本不知道具体的实现是谁,客户端只是面向产品的接口编程而已。客户端从具体的产品的实现中解耦。
- 使得切换产品簇变得容易
客户端选用不同的工厂实现,就是切换不同的产品簇的过程。
4.2 抽象工厂的缺点
- 不太容易扩展新的产品
如果需要给整个产品簇添加一个新的产品,那么需要修改抽象工厂,这样会导致修改所有的工厂实现类。
- 容易造成类层次复杂
在使用抽象工厂模式的时候,如果需要选择的层次过多,那么会造成整个类层次变得复杂。
4.3 抽象工厂模式和简单工厂模式的对比
抽象工厂和简单工厂既有区别,又有联系,可以组合使用。工厂方法模式一般是针对单独的产品对象的创建,而抽象工厂模式注重产品簇对象的创建。如果把抽象工厂创建的产品簇简化,这个产品簇就只有一个产品,那么这个时候的抽象工厂跟简单工厂差不多。
4.4 抽象工厂模式和单例模式的联系
两个模式可以组合使用,在抽象工厂模式里面,具体的工厂实现,在整个应用中,通常一个产品系列只需要一个实例就可以了,因此可以把具体的工厂实现称为单例。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/9578.html