Android设计模式-抽象工厂模式

UML关系简单介绍
UML简单使用的介绍
创建型设计模式
Android设计模式-单例模式
Android设计模式-工厂模式
Android设计模式-抽象工厂模式
Android设计模式-建造者模式
Android设计模式-原型模式
结构型设计模式
Android设计模式-代理模式
Android设计模式-装饰模式
Android设计模式-适配器模式
Android设计模式-组合模式
Android设计模式-门面模式
Android设计模式-桥接模式
Android设计模式-享元模式
行为型设计模式
Android设计模式-策略模式
Android设计模式-命令模式
Android设计模式-责任链模式
Android设计模式-模版方法模式
Android设计模式-迭代器模式
Android设计模式-观察者模式
Android设计模式-备忘录模式
Android设计模式-中介者模式
Android设计模式-访问者模式
Android设计模式-状态模式
Android设计模式-解释器模式

1.定义

为创建一组相关或者相互依赖的对象提供一个接口,而且无需指定他们的具体实现类

2.抽象工厂模式UML图

Android设计模式-抽象工厂模式_第1张图片
抽象工厂UML图

角色介绍

  • client 客户端,调用场景
  • AbstractFactory 抽象工厂类
  • ConcreteFactory 具体工厂类
  • AbstractProduct 抽象产品类
  • ConcreteProduct 具体产品类

3.实现

举例说明:一个抽象工厂,有两个具体的实现,分别为Factory1和Factory2,分别生产数字为1和为2的产品

3.1抽象工程类

public abstract class AbstractFactory {
    public abstract AbstractProductA createA();
    public abstract AbstractProductB createB();
}

3.2具体工厂类

public class Factory1 extends AbstractFactory {
    //1工厂生产产品为1的产品
    @Override
    public AbstractProductA createA() {
        return new ProductA1();
    }
    //1工厂生产产品为1的产品
    @Override
    public AbstractProductB createB() {
        return new ProductB1();
    }
}

public class Factory2 extends AbstractFactory {
    //2工厂生产产品为2的产品
    @Override
    public AbstractProductA createA() {
        return new ProductA2();
    }
    //2工厂生产产品为2的产品
    @Override
    public AbstractProductB createB() {
        return new ProductB2();
    }
}

3.3抽象产品类

public abstract class AbstractProductA {
    //产品共有的方法
    public void a1(){

    }
    //每个产品不同的实现
    public abstract void a2();
}

public abstract class AbstractProductB {
    //产品共有的方法
    public void b1(){

    }
    //每个产品不同的实现
    public abstract void b2();
}

3.4 具体产品

public class ProductA1 extends AbstractProductA {
    @Override
    public void a2() {
        System.out.println("我是产品A1");
    }
}

public class ProductA2 extends AbstractProductA {
    @Override
    public void a2() {
        System.out.println("我是产品A2");
    }
}

public class ProductB1 extends AbstractProductB {
    @Override
    public void b2() {
        System.out.println("我是产品B1");
    }
}

public class ProductB2 extends AbstractProductB {
    @Override
    public void b2() {
        System.out.println("我是产品B2");
    }
}

3.5场景调用

public class MyClass {
    public static void main(String args[]) {
        AbstractFactory factory1=new Factory1();
        AbstractFactory factory2=new Factory2();

        AbstractProductA a1=factory1.createA();
        AbstractProductA a2=factory2.createA();

        AbstractProductB b1=factory1.createB();
        AbstractProductB b2=factory2.createB();

        a1.a2();
        a2.a2();

        b1.b2();
        b2.b2();
    }
}

//打印结果
我是产品A1
我是产品A2
我是产品B1
我是产品B2

4.总结

  • 抽象工厂模式有良好的封装性,但是扩展性却很差,如以上的例子,如果要增加一个C产品,那么抽象工厂和具体工厂都需要修改。但是如果只是增加一个产品等级3,那么只需要增加一个具体工厂和产品类即可,也就是说横向扩展容易,纵向扩展难,但是横向纵向的设定,还是看自己设计了,你完全可以将产品等级设计为纵向,产品类型设计为横向,结果也就反了过来,所以具体设计的时候,要想清楚了。
  • 使用场景:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。
  • 工厂模式与抽象工厂模式的区别,简单来说,就相当于工厂模式是只有一条生产线的工厂,而抽象工厂模式是具有多条生产线的工厂。

你可能感兴趣的:(Android设计模式-抽象工厂模式)