设计模式之抽象工厂模式
定义
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
结构
- ProductFactory,抽象产品工厂,声明了一组创建一簇产品的工厂方法,每一个方法对应一种产品。
- MobileProduct,ComputerProduct,抽象产品,工厂方法返回的接口类型。
- HuaweiProductFactory,SamsungProductFactory,具体工厂,实现抽象工厂接口,工厂方法返回一簇具体产品。
- HuaweiMobileProduct,HuaweiComputerProduct,具体产品,抽象产品的实现。
简单实现
两种抽象产品
/**
* 手机产品
*/
public interface MobileProduct {
void show();
}
/**
* 电脑产品
*/
public interface ComputerProduct {
void show();
}
抽象工厂
public interface ProductFactory {
/**
* 创建手机产品
*/
MobileProduct createMobileProduct();
/**
* 创建电脑产品
*/
ComputerProduct createComputerProduct();
}
具体工厂和具体产品
/**
* 华为产品工厂
*/
public class HuaweiProductFactory implements ProductFactory {
@Override
public MobileProduct createMobileProduct() {
return new HuaweiMobileProduct();
}
@Override
public ComputerProduct createComputerProduct() {
return new HuaweiComputerProduct();
}
public static class HuaweiMobileProduct implements MobileProduct {
@Override
public void show() {
System.out.println("HuaweiMobileProduct show");
}
}
public static class HuaweiComputerProduct implements ComputerProduct {
@Override
public void show() {
System.out.println("HuaweiComputerProduct show");
}
}
}
第二个具体工厂实现
/**
* 三星产品工厂
*/
public class SamsungProductFactory implements ProductFactory {
@Override
public MobileProduct createMobileProduct() {
return new SamsungMobileProduct();
}
@Override
public ComputerProduct createComputerProduct() {
return new SamsungComputerProduct();
}
public static class SamsungMobileProduct implements MobileProduct {
@Override
public void show() {
System.out.println("SamsungMobileProduct show");
}
}
public static class SamsungComputerProduct implements ComputerProduct {
@Override
public void show() {
System.out.println("SamsungComputerProduct show");
}
}
}
客户端
public class Client {
public static void main(String[] args) {
ProductFactory productFactory = new SamsungProductFactory();
productFactory.createMobileProduct().show();
productFactory.createComputerProduct().show();
}
}
定义两组产品,华为和三星,每组都有自己的手机产品和电脑产品。
抽象工厂模式在JDK中的实现
JDK中操作数据库的接口 Connection
public interface Connection {
//创建一个执行对象
Statement createStatement() throws SQLException;
//创建一个支持预编译的执行对象
PreparedStatement prepareStatement(String sql) throws SQLException;
//创建一个支持存储过程的执行对象
CallableStatement prepareCall(String sql) throws SQLException;
}
Connection 就是抽象工厂,Statement,PreparedStatement,CallableStatement 就是抽象产品,各种数据库实现如 MySQL 和 SQLServer 就是具体产品工厂和具体产品。
总结
优点
- 隔离接口和实现,很容易增加新的产品簇。
缺点
- 增加新的产品类型很麻烦,需要修改原有系统,甚至需要修改抽象层代码,从这个角度看,违背了开闭原则。
- 类层次容易变复杂。
本质
抽象工厂模式的本质就是选择产品簇的实现,如果只有一种产品就会退化成工厂方法模式。
使用场景
- 产品的创建和使用需要解耦,有多于一个的产品簇,并且产品类型稳定,不会轻易修改,这种情况下可以使用抽象工厂模式。
参考
大战设计模式【6】—— 抽象工厂模式
大战设计模式(第二季)【1】———— 从源码看工厂模式
设计模式的征途—4.抽象工厂(Abstract Factory)模式
研磨设计模式-书籍