监考老师很好,下半年继续
继续上一回的工厂方法模式之后,我们进一步说一下抽象工厂。
Abstract Factory(抽象工厂)
特点
抽象工厂提供了一个创建一系列相关或相互依赖的接口,且无须指定它们具体的类。
大概结构
按照理解,自己在processOn里画了一个大概的结构,大家凑合的看。
其中
- AbstractFactory 声明一个抽象对象的操作接口
- ConcreteFactory 实现具体对象的操作
- AbstractProduct 为一类对象声明接口
- ConcreteProduct 定义一个相对应的产品对象,内部实现AbstractProduct
- Client 仅使用由AbstractFactory 和 AbstractProduct 类声明的接口
与工厂方法相比,其实就在产品的抽象上多抽一个产品B,工厂接口中多定义个方法。
代码
按照结构图,创建Factory接口类,声明两个产品的接口方法。
代码语言:javascript复制interface Factory {
ProductA createProductA();
ProductB createProductB();
}
实现类Factory上,创建FactoryA和FactoryB来实现createProduct方法,返回对应的类。
代码语言:javascript复制class FactoryA implements Factory{
@Override
public ProductA createProductA(){
return new ProductA1();
}
@Override
public ProductB createProductB(){
return new ProductB1();
}
}
class FactoryB implements Factory{
@Override
public ProductA createProductA(){
return new ProductA2();
}
@Override
public ProductB createProductB(){
return new ProductB2();
}
}
声明两种产品的接口类ProductA 和ProductB
代码语言:javascript复制interface ProductA {
void method();
}
interface ProductB {
void method();
}
以及对应的实现类
代码语言:javascript复制class ProductA1 implements ProductA{
@Override
public void method()
{
System.out.println("产品A1");
}
}
class ProductA2 implements ProductA{
@Override
public void method()
{
System.out.println("产品A2");
}
}
class ProductB1 implements ProductB{
@Override
public void method()
{
System.out.println("产品B1");
}
}
class ProductB2 implements ProductB{
@Override
public void method()
{
System.out.println("产品B2");
}
}
Client作为Main函数进行创建工厂对象并创建类
代码语言:javascript复制public static void main(String[] args)
{
Factory factoryA = new FactoryA();
ProductA productA = factoryA.createProductA();
//打印 产品A1
productA.method();
Factory factoryB = new FactoryB();
ProductB productB = factoryB.createProductB();
//打印 产品B2
productB.method();
}
适用性
它适用于
- 独立于产品的创建,表示和组合时。
- 由多个产品中的一个来配置时。
- 提供一个产品库,仅显示接口而不是实现时。
结束
抽象工厂的每个方法看起来都像是工厂方法,且每个方法都被声明成抽象,由子类的方法进行覆盖和实现。
希望本文能对大家有所帮助,和了不起一起持续学习。