1. 抽象工厂模式的定义
创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。它的通用类图如下:
抽象工厂模式是工厂模式的升级版,有多个业务品种时候采用抽象工厂模式。产品的抽象类,代码如下:
public abstract class AbstractProductA {
//相同的功能
public void dothing(){
System.out.println("公用");
}
//特定的功能
public abstract void doSomething();
}
public abstract class AbstractProductB {
//相同的功能
public void dothing(){
System.out.println("公用");
}
//特定的功能
public abstract void doSomething();
}
具体的产品实现抽象类,包括A和B,代码如下:
public class productA1 extends AbstractProductA{
@Override
public void doSomething() {
System.out.println("我要A1");
}
}
public class productA2 extends AbstractProductA{
@Override
public void doSomething() {
System.out.println("我要A2");
}
}
public class productB1 extends AbstractProductB{
@Override
public void doSomething() {
System.out.println("我要B1");
}
}
public class productB2 extends AbstractProductB{
@Override
public void doSomething() {
System.out.println("我要B2");
}
}
抽象工厂类AbstractCreator的职责是定义每个工厂要实现的功能,抽象工厂定义了两个产品。对于多个产品还可以增加。代码如下:
public abstract class AbstractCreator {
public abstract AbstractProductA createProductA();
public abstract AbstractProductB createProductB();
}
创建产品,由具体的实现类实现,代码如下:
public class Creator1 extends AbstractCreator{
@Override
public AbstractProductA createProductA() {
return new productA1();
}
@Override
public AbstractProductB createProductB() {
return new productB1();
}
}
public class Creator2 extends AbstractCreator{
@Override
public AbstractProductA createProductA() {
return new productA2();
}
@Override
public AbstractProductB createProductB() {
return new productB2();
}
}
最后测试测类,代码如下:
public class factoryTest {
public static void main(String[] args) {
AbstractCreator creator1 = new Creator1();
AbstractCreator creator2 = new Creator2();
AbstractProductA productA1= creator1.createProductA();
AbstractProductB productB1= creator1.createProductB();
AbstractProductA productA2= creator2.createProductA();
AbstractProductB productB2= creator2.createProductB();
productA1.dothing();
productA1.doSomething();
productB1.dothing();
productB1.doSomething();
}
}
2.工厂模式和抽象工厂模式的区别
1:工厂方法模式
一个抽象产品类,可以产生出多个具体产品类。 (例如 :上一篇工厂模式只创建了一个商品,实现多个具体的商品)
一个抽象工厂类,可以产生出多个具体工厂类。 (例如 :上一篇工厂模式只创建了一个工厂,有多个工厂类)
每个具体工厂类只能创建一个具体产品类的实例。
2:抽象工厂模式
多个抽象产品类,每个抽象产品类可以产生出多个具体产品类。 (创建了多个抽象产品类,每个都可以创建多个具体产品类)
一个抽象工厂类,可以产生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
3. 抽象工厂模式的优缺点
3.1 优点
每个产品的实现类不是高层模块要关心的,它要关心的是接口,是抽象,它不关心对象是如何创建出来的,这都由工厂类负责的,只要知道工厂类是谁,我就能创建一个需要的对象,省时省力。
产品等级扩展还是非常容易的,增加一个产品等级,只要增加一个工厂类负责新增加出来的产品生产任务即可。
3.2 缺点
抽象工厂模式最大的缺点就是产品族扩展非常困难。如果我们要增加一个产品C,也就是说产品族由原来的A和B增加到3个,那么我们首先要在抽象类AbstractCreator中增加createProductC()方法.拓展有一些弊端