抽象工厂是一种常见的设计模式。此模式为一个产品家族提供了统一的创建接口。当需要这个产品家族的某一系列的时候,可以从抽象工厂中选出相对系的系列来创建一个具体的工厂类别。
外文名 Abstract Factory
适用性:
在以下情况可以使用抽象工厂模式
一个系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
优点
具体产品从客户代码中被分离出来
容易改变产品的系列
将一个系列的产品族统一到一起创建
缺点
在产品族中扩展新的产品是很困难的,它需要修改抽象工厂的接口
以上介绍我们来动手实践下:
由介绍得知:抽象工厂生产的就是产品蔟,那么我们来创建一组A类型的产品和一组B类型的产品,其中A类型的产品要和B类型的产品相对应。也就是我们说的产品蔟。
首先我们来创建一个A类型的产品抽象接口:ProductA
public interface ProductA {
void name();
}
创建B类型的产品接口:ProductB
public interface ProductB {
void name();
}
有了产品,接下来我们就要创建一个工厂来生产对应的产品蔟。可是我们并不知道要生成产什么类型的产品蔟。所以我们需要把工厂抽象。由子类来决定生产那种类型的产品蔟。
首先我们来个抽象工厂,并声明要生成A类型和B类型的产品蔟
AbstractFactory:
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
有工厂有产品。我们还需要一些具体的产品和工厂不是吗?
首先来A类型的产品 A1和A2
A1:
public class ProductA1 implements ProductA{
@Override
public void name() {
System.out.println("产品A1类型");
}
}
A2:
public class ProductA2 implements ProductA{
@Override
public void name() {
System.out.println("产品A2类型");
}
}
以上是A类型的不同产品,比如。我们的CPU的阵脚数目,有些阵脚数目是1156,而有些阵脚数目却是1150。那么我们对应的要有能够装上这些CPU的主板吧。我们的主板上有的有1150个插孔。肯定不能插1156阵脚的CPU吧。当然。拔掉6根就可以了,哈哈。开玩笑哈~~
那么 有了A类型的产品。我们来创建具体的B类型的产品吧,同样我们来创建B1和B2
B1
public class ProductB1 implements ProductB {
@Override
public void name() {
System.out.println("产品B1类型");
}
}
B2
public class ProductB2 implements ProductB {
@Override
public void name() {
System.out.println(("产品B2类型"));
}
}
以上。我们创建了工厂和具体的产品。那么我们的工厂要怎么生产呢?
比如上面的介绍。CPU和主板的例子。有些人看到这里就会恍然大悟吧。再想想。我们抽象工厂解决的是什么问题?产品蔟。对了!那么根据这个思路。我们来创建两个工厂,分别来生成不同的产品蔟。
我们来创建工厂1和工厂2 分别来生成两种产品蔟。以下代码实现
工厂1
public class Factory1 implements AbstractFactory{
@Override
public ProductA createProductA() {
return new ProductA1();
}
@Override
public ProductB createProductB() {
return new ProductB1();
}
}
工厂2
public class Factory2 implements AbstractFactory{
@Override
public ProductA createProductA() {
return new ProductA2();
}
@Override
public ProductB createProductB() {
return new ProductB2();
}
}
这里的工厂1和工厂2他们都提供了两类产品的不同产品蔟。
工厂1生产的是 1类型的产品蔟。工厂2生产的是2类型的产品蔟。
比如A1代表CPU 阵脚数目为1150 B1代表主板 插孔数目为1150
他们生产的产品一定是配套的。到这里大家可以体会到了抽象工厂的神奇之处了吧。
我们来提供一个客户端。测试一把~
public class Client {
public static void main(String[] args) {
AbstractFactory factory = new Factory1();
ProductA productA = factory.createProductA();
ProductB productB = factory.createProductB();
productA.name();
productB.name();
}
}
网友评论