抽象工厂模式定义
提供一个接口,用于创建一系列相关或依赖的对象,而不需要明确指定具体类。
解释:提供的接口指的是抽象工厂;一系列相关或依赖的对象指的是产品族。
抽象工厂模式结构图
抽象工厂模式角色介绍
AbstractProduct:抽象产品角色,它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
ConcreteProduct:具体产品角色,它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。
AbstractFactory:抽象工厂角色,它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
ConcreteFactory:具体工厂角色,它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
抽象工厂模式结构代码
产品族之抽象产品A:
public abstract class AbstractProductA {
public abstract void sayName();
}
具体产品A1:
public class ConcreteProductA1 extends AbstractProductA {
public void sayName() {
System.out.println("ConcreteProductA1");
}
}
具体产品A2:
public class ConcreteProductA2 extends AbstractProductA {
public void sayName() {
System.out.println("ConcreteProductA2");
}
}
产品族之抽象产品B:
public abstract class AbstractProductB {
public abstract void sayName();
}
具体产品B1:
public class ConcreteProductB1 extends AbstractProductB {
public void sayName() {
System.out.println("ConcreteProductB1");
}
}
具体产品B2:
public class ConcreteProductB2 extends AbstractProductB {
public void sayName() {
System.out.println("ConcreteProductB2");
}
}
抽象工厂:
public abstract class Factory {
/**
* 定义抽象工厂方法,创建产品,创建过程延迟到子类
* @return
*/
abstract AbstractProductA createProductA();
/**
* 定义抽象工厂方法,创建产品,创建过程延迟到子类
* @return
*/
abstract AbstractProductB createProductB();
}
具体工厂1:
public class Factory1 extends Factory{
public AbstractProductA createProductA() {
return new ConcreteProductA1();
}
public AbstractProductB createProductB() {
return new ConcreteProductB1();
}
}
具体工厂2:
public class Factory2 extends Factory{
public AbstractProductA createProductA() {
return new ConcreteProductA2();
}
public AbstractProductB createProductB() {
return new ConcreteProductB2();
}
}
客户端:
public class Client {
public static void main(String[] args) {
//客户端按照需要获取具体子类工厂实例
Factory factory = new Factory2();
AbstractProductA pa = factory.createProductA();
pa.sayName();
AbstractProductB pb = factory.createProductB();
pb.sayName();
}
}
抽象工厂模式核心运行机制
多个具体产品实现一个抽象产品,多个抽象产品组成一个产品族;由定义的抽象工厂负责创建产品族中所有的抽象产品,具体工厂不同,得到的产品族的具体产品则不同;客户端面向抽象产品、 抽象工厂编程;可以通过动态化、配置化获取产品族工厂,进而获取所有具体产品。
抽象工厂模式解决的核心问题
抽象工厂模式是对工厂方法模式进一步整合复用,解决的是过多产品种类造成抽象工厂类过多的问题,将一个抽象工厂创建一个具体产品调整为一个抽象工厂可以创建一批具体产品,也就是一个产品族,产品族是所有抽象产品的集合;
抽象工厂模式,抽象产品数量大于1,每增加一个抽象产品,都需要在抽象工厂里面增加一个创建该抽象产品的接口,所有具体工厂负责实现该接口。
抽象工厂模式符合面向对象的设计原则
抽象工厂模式与工厂方法模式符合的设计原则是一致的,都符合依赖倒转原则、里氏替换原则、单一职责原则和开闭原则。