建立型模式-抽象工厂

1. 定义

抽象工厂模式(Abstract Factory Pattern):提供一个建立一系列相关或相互依赖对象的接口,而
无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象建立型模式。git

2. 结构

在抽象工厂模式中,每个具体工厂都提供了多个工厂方法用于产生多种不一样类型的产品,这些产品构成了一个产品族,抽象工厂模式结构如图所示:设计模式

抽象工厂结构

  • AbstractFactory(抽象工厂):它声明了一组用于建立一族产品的方法,每个方法对应一种产品。(一族产品理解为海尔牌子的冰箱,洗衣机,电视机等)
  • ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的建立产品的方法,生成一组具体产品,这些产品构成了一个产品族,每个产品都位于某个产品等级结构中。
  • AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具备的业务方法。(理解为不一样牌子冰箱的父类)
  • ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

3. 代码实现

同一个品牌的这边给他算一个产品族,冰箱,电视算两个产品等级结构,一个具体的工厂实现类能够产生同一个品牌的不一样的产品。
产品1接口ide

public interface Fridge {

    void freeze();

}

产品1实现类1测试

public class HaierFridge implements Fridge {

    @Override
    public void freeze() {
        System.out.println("海尔冰箱冰冻啦");
    }
}

产品2实现类2设计

public class MediaFridge implements Fridge {

    @Override
    public void freeze() {
        System.out.println("美的冰箱冰冻啦");
    }
}

产品2接口code

public interface Tv {

    void watch();
}

产品2实现类1对象

public class HaierTv implements Tv {

    @Override
    public void watch() {
        System.out.println("看海尔电视啦");
    }
}

产品2实现类2blog

public class MediaTv implements Tv {

    @Override
    public void watch() {
        System.out.println("看美的电视啦");
    }
}

工厂接口接口

public interface Factory {

    Tv getTv();

    Fridge getFridge();
}

工厂实现类1

public class HaierFactory implements Factory {

    @Override
    public Tv getTv() {
        return new HaierTv();
    }

    @Override
    public Fridge getFridge() {
        return new HaierFridge();
    }
}

工厂实现类2

public class MediaFactory implements Factory {

    @Override
    public Tv getTv() {
        return new MediaTv();
    }

    @Override
    public Fridge getFridge() {
        return new MediaFridge();
    }
}

测试

public class Test {

    public static void main(String[] args) {
        //能够从配置文件中得到具体类名,经过反射得到相应的工厂类来实现其配置化
        Factory factory1=new HaierFactory();
        factory1.getTv().watch();
        factory1.getFridge().freeze();

        Factory factory2=new MediaFactory();
        factory2.getTv().watch();
        factory2.getFridge().freeze();
    }
}

//看海尔电视啦
//海尔冰箱冰冻啦
//看美的电视啦
//美的冰箱冰冻啦

4. “开闭原则”的倾斜性(最大缺点)

在抽象工厂模式中,增长新的产品族很方便(如添加一个牌子的产品族),可是增长新的产品等级结构(添加洗衣机这个新的产品登记结构)很麻烦,抽象工厂模式的这种性质称为“开闭原则”的倾斜性。“开闭原则”要求系统对扩展开放,对修改封闭,经过扩展达到加强其功能的目的,对于涉及到多个产品族与多个产品等级结构的系统,其功能加强包括两方面:

  1. 增长产品族:对于增长新的产品族,抽象工厂模式很好地支持了“开闭原则”,只须要增长具体产品并对应增长一个新的具体工厂,对已有代码无须作任何修改。
  2. 增长新的产品等级结构:对于增长新的产品等级结构,须要修改全部的工厂角色,包括抽象工厂类,在全部的工厂类中都须要增长生产新产品的方法,违背了“开闭原则”。

5. 优缺点

  • 优势
  1. 抽象工厂模式隔离了具体类的生成,使得客户并不须要知道什么具体类被建立,只管调用工厂方法获得对应的产品接口便可。
  2. 将同一个产品族的产品在工厂实现类中放在了一块,使得客户端始终使用同一族中的对象。
  3. 增长新的产品族很方便,无须修改已有系统,符合“开闭原则”。
  • 缺点
  1. 增长新的产品等级结构麻烦,须要对原有系统进行较大的修改,甚至须要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。

6. 适用场景

  1. 用于对象的建立和使用的解耦,系统不依赖于产品类实例如何被建立、组合和表达的细节。
  2. 系统中有多于一个的产品族,而每次只使用其中某一产品族。能够经过配置文件等方式来使得用户能够动态改变产品族,也能够很方便地增长新的产品族。
  3. 属于同一个产品族的产品将在一块儿使用,这一约束必须在系统的设计中体现出来。(产品族须要具备一些共同约束,好比属于同一个牌子等)
  4. 产品等级结构稳定,设计完成以后,不会向系统中增长新的产品等级结构或者删除已有的产品等级结构。

7. 我的理解

将具备共同约束的多个产品放在一个族里,工厂类中能够产生多个属于同一个产品族的产品,相比于工厂方法的每一个产品一个工厂类来讲可大量减小类的数量。缺点就是不可扩展其余产品种类。

参考

  1. Java设计模式-刘伟
相关文章
相关标签/搜索