一、定义
为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类
二、通用代码
- A产品族
//A抽象产品类
public abstract class AbstractProductA{
public void shareMethod(){
//A产品的通用方法
}
//每个产品的相同方法,不同实现
public abstract void doSomethings();
}
//产品A1的实现类
public class ProductA1 extends AbstractProductA1{
public void doSomethings(){
System.out.println("产品A1的实现方法");
}
}
//产品A2的实现类
public class ProductA1 extends AbstractProductA2{
public void doSomethings(){
System.out.println("产品A2的实现方法");
}
}
- B产品族代码与A产品族相同
- 工厂类
//抽象工厂类
public abstract class AbstractCreator{
//创建A产品族
public abstract AbstractProductA createProductA();
//创建B产品族
public abstract AbstractProductB createProductB();
}
//实现工厂类1,生产各系列的1号产品
public class Creator1 extends AbstractCreator{
public AbstractProductA createProductA(){
return new ProductA1();
}
public AbstractProductB createProductB(){
return new ProductB1();
}
}
//实现工厂类2,生产各系列的2号产品
public class Creator2 extends AbstractCreator{
public AbstractProductA createProductA(){
return new ProductA2();
}
public AbstractProductB createProductB(){
return new ProductB2();
}
}
- 场景类
public class Client{
public static void main(String[] args){
//定义两个工厂
AbstractCreator creator1 = new Creator1();
AbstractCreator creator2 = new Creator2();
//生产各产品对象
AbstractProductA a1 = creator1.createProductA();
AbstractProductB b1 = creator1.createProductB();
AbstractProductA a2 = creator2.createProductA();
AbstractProductB b2 = creator2.createProductB();
}
}
三、优点
- 封装性,高层模块无需关心每个产品的实现类。
- 产品族内的约束为非公开状态。
四、缺点
- 产品族扩展非常困难
- 增加一个产品族,与产品族相关的各工厂与场景类都需要更改
五、应用场景
- 一个对象族拥有相同的约束的情况下
六、注意
- 产品族扩展困难,但不是产品子类扩展困难。