1. 定义
是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
2. 特点
2.1 优点
- 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
- 当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
- 抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。
2.2 缺点
当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。
3. 角色
- 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
- 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
4. 实现
package AbstractFactory;
public interface AbstractProductA {
void show();
}
package AbstractFactory;
public class ProductA1 implements AbstractProductA {
@Override
public void show() {
System.out.println("This is ProductA1");
}
}
package AbstractFactory;
public class ProductA2 implements AbstractProductA {
@Override
public void show() {
System.out.println("This is ProductA2");
}
}
package AbstractFactory;
public interface AbstractProductB {
void show();
}
package AbstractFactory;
public class ProductB1 implements AbstractProductB {
@Override
public void show() {
System.out.println("This is ProductB1");
}
}
package AbstractFactory;
public class ProductB2 implements AbstractProductB {
@Override
public void show() {
System.out.println("This is ProductB2");
}
}
package AbstractFactory;
public interface AbstractFactory {
AbstractProductA createProductA();
AbstractProductB createProductB();
}
package AbstractFactory;
public class ConcreteFactory1 implements AbstractFactory {
@Override
public ProductA1 createProductA() {
return new ProductA1();
}
@Override
public ProductB1 createProductB() {
return new ProductB1();
}
}
package AbstractFactory;
public class ConcreteFactory2 implements AbstractFactory {
@Override
public ProductA2 createProductA() {
return new ProductA2();
}
@Override
public ProductB2 createProductB() {
return new ProductB2();
}
}
package AbstractFactory;
public class Client {
public static void main(String[] args) {
AbstractFactory abstractFactory1 = new ConcreteFactory1();
AbstractProductA productA = abstractFactory1.createProductA();
productA.show();
AbstractFactory abstractFactory2 = new ConcreteFactory2();
AbstractProductB productB = abstractFactory2.createProductB();
productB.show();
}
}
5. 应用场景
- 一个系统要独立于它的产品的创建、组合和表示
- 一个系统要由多个产品系列中的一个类配置
- 要强调一系列相关的产品对象的设计以便进行联合使用
- 提供一个产品类库,但只想显示它们的接口而不是实现
网友评论