一、模式定义
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
简单来说,抽象工厂模式就是工厂模式的拓展,不同的是,抽象工厂模式能生产多种具有联系的产品对象,而工厂模式一个工厂只生产一种产品。
下面通过类图来分析具有联系的含义。
二、模式类图
从图中我们能看出工厂子类能同时生产产品A和产品B,这里想说的具有联系就是说,A和B可能是同一个产品公司旗下的产品,这就引申出产品等级结构概念。
用打比方来解释产品等级结构的概念,比如说苹果和华为都能生产手机和平板电脑,即ProductA代表手机,ConcreteProductA1代表苹果手机,ConcreteProductA2代表华为手机,ProductB代表平板电脑,那么手机和平板电脑就处在不同的等级结构。而ConcreteFactoryA也就代表苹果公司,ConcreteFactoryB代表华为公司,如此一来,对抽象工厂模式也就进一步加深理解了。
三、模式代码
abstract class Factory{
//这里是抽象工厂类
abstract public ProductA createProductA();
abstract public ProductB createProductB();
}
class ConcreteFactoryA extends Factory{
//这里是具体工厂类
public ProductA createProductA() { return new ConcreteProductA1();}
public ProductB createProductB() { return new ConcreteProductB1();}
}
class ConcreteFactoryB extends Factory{
public ProductA createProductA() { return new ConcreteProductA2();}
public ProductB createProductB() { return new ConcreteProductB2();}
}
abstract class ProductA{
//这里是抽象产品类A
abstract public void Print();
}
class ConcreteProductA1 extends ProductA{
//这里是具体产品类A1
public void Print() { System.out.println("This is A1");}
}
class ConcreteProductA2 extends ProductA{
public void Print() { System.out.println("This is A2");}
}
abstract class ProductB{
//这里是抽象产品类B
abstract public void Print();
}
class ConcreteProductB1 extends ProductB{
//这里是具体产品类B1
public void Print() {System.out.println("This is B1");}
}
class ConcreteProductB2 extends ProductB{
public void Print() {System.out.println("This is B2");}
}
public class Main {
public static void main(String[] args) {
Factory A = new ConcreteFactoryA();
Factory B = new ConcreteFactoryB();
ProductA pA1 = A.createProductA();
ProductB pB1 = A.createProductB();
ProductA pA2 = B.createProductA();
ProductB pB2 = B.createProductB();
pA1.Print(); pA2.Print();
pB1.Print(); pB2.Print();
}
}
四、模式优缺点
1.优点:保证了客户始终使用的是一个产品族的对象(对于一些需要针对当前环境决定行为的软件来说是不错之选),符合开闭原则。
2.缺点:开闭原则的倾斜性(增加新产品族困难)。