Android重拾设计模式系列——抽象工厂模式

抽象工厂模式和工厂方法模式很相似,都是延迟子类选择创建,但它们的不同点在于:

工厂方法模式专注于创建单个完整的产品,而抽象工厂模式专注于创建构一个完整产品的所有部件。比如说,工厂方法模式创建一把单手剑,而抽象工厂模式需要创建剑柄、剑体、需要用的材料等。它们思想相同,但关注点不一样。工厂方法模式可以理解为宏观,而抽象工厂模式可以理解为微观。
[工厂方法模式传送门]

定义及实质

  • 定义

提供创建一系列相关或相互依赖的对象的接口,而无需指定它们的具体类。

  • 实质

选择产品簇的实现。

模式图解

抽象工厂模式UML图


从上图可以看出:
1. 首先定义了一个抽象工厂类AbstractFactory,它相当于一个模版,它能够生产具有相关关系的产品A、B,其子类工厂按照这个规范进行扩展;
2. 定义两种产品接口(产品模版),AbstarctProductAAbstarctProductB,它们是相关的产品类型,比如说剑柄和剑体;
3. 继承抽象工厂类AbstractFactory,定义两种不同的工厂,分别用于生产1系列产品和2系列产品。
下面是工厂类:

//抽象工厂类AbstractFactory
public abstract class AbstractFactory{
    public abstract AbstractProductA createProductA();
    public abstract AbstractProductB createProductB();
}

//1系列产品工厂
public class ConcreteFactory1{
    @Overrid
    public AbstractProductA createProductA(){
        return new ProductA1();
    }

    @Overrid
    public AbstractProductB createProductB(){
        return new ProductB1();
    }
}

//2系列产品工厂
public class ConcreteFactory1{
    @Overrid
    public AbstractProductA createProductA(){
        return new ProductA2();
    }

    @Overrid
    public AbstractProductB createProductB(){
        return new ProductB2();
    }
}

下面是产品类:

//A类产品接口(模版)
public interface AbstractProductA{
    void doSomthing();
}

//A1产品
public class ProductA1 implement AbstractProductA{
    @Overrid
    public void doSomething(){
        System.out.println("ProductA1");
    }
}

//A2产品
public class ProductA2 implement AbstractProductA{
    @Overrid
    public void doSomething(){
        System.out.println("ProductA2");
    }
}

//B类产品接口(模版)
public interface AbstractProductB{
    void doSomthing();
}

//B1产品
public class ProductB1 implement AbstractProductB{
    @Overrid
    public void doSomething(){
        System.out.println("ProductB1");
    }
}

//B2产品
public class ProductB2 implement AbstractProductB{
    @Overrid
    public void doSomething(){
        System.out.println("ProductB2");
    }
}

下面看看Client客户端如何使用:

public class Client{
    public static void main(String[] args){
        //现在需要创建1系列产品
        AbstractFactory factory = new ConcreteFactory1();
        ProductA a1 = factory.createProductA();
        ProductB b1 = factory.createProductB();

        //接下来创建2系列产品
        factory = new ConcreteFactory2();
        ProductA a2 = factory.createProductA();
        ProductB b2 = factory.createProductB();
    }
}

抽象工厂模式顺序图


结合上面代码来看顺序图。

模式优缺点

优势

  1. 封装复杂创建逻辑;
  2. 解耦Client和产品;
  3. 方便切换产品簇,只需更换工厂实例就行。

缺点

  1. 不容易扩展新产品,当需要增加新的产品类型时,不得不把之前的每个工厂类都修改;
  2. 容易造成选择层次的复杂,因为当产品类型多时,配置方案也将增加。

你可能感兴趣的:(Android之设计模式,android,抽象工厂模式,设计模式,Java)