抽象工廠模式

抽象工廠模式定義

抽象工廠模式(Abstract Factory Pattern),屬於對象建立型模式。提供一個建立一系列相關或相互依賴(即一族)對象的接口,不須要指定它們具體的類。java

產品族小解

上圖中Phone和Computer屬於不一樣的產品等級結構,即產品的繼承結構。如一個抽象的手機,子類能夠是蘋果手機、聯想手機、小米手機,這樣抽象的手機和具體品牌的手機之間構成了一個產品等級結構,抽象手機做爲父類,品牌手機做爲子類。電腦的產品等級結構也是如此。git

而上圖中指出的產品族,簡單理解就是產品的家族。即由一個工廠生產的位於不一樣產品等級結構中的一組產品。上圖中iPhone是手機產品等級結構、MacBook是電腦產品等級結構,但都是蘋果公司一族的。github

抽象工廠模式適用環境

1.當系統提供的工廠需生產的具體產品並非一個簡單的對象,而是多個位於不一樣產品等級結構中屬於不一樣類型的具體產品時。簡而言之,抽象工廠模式須要面對的是多個產品等級結構,而工廠方法模式針對的是一個產品等級結構。web

UML類圖解釋

ProductA_Phone:產品A接口
ProductB_Computer :產品B接口
ConcreteProductA1_Iphone: 具體A類產品A1(實現產品A接口)
ConcreteProductA2_Lenove: 具體A類產品A2(實現產品A接口)
ConcreteProductA3_Xiaomi: 具體A類產品A3(實現產品A接口)
ConcreteProductB1_MacBook: 具體B類產品B1(實現產品B接口)
ConcreteProductB2_ThinkPad: 具體B類產品B2(實現產品B接口)
ConcreteProductB3_XiaomiAir :具體B類產品B3(實現產品B接口)
Factory :工廠接口
Factory1_Apple :具體Apple族工廠
Factory2_Lenove: 具體Lenove族工廠
Factory3_Xiaomi :具體Xiaomi族工廠sql

樣例代碼

package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;

import java.util.logging.Logger;

/**
 * 產品A 手機類 蘋果家族 ==> 蘋果手機
 * @auther mynawang
 * @create 2016-12-29 10:41
 */
public class ConcreteProductA1_Iphone implements ProductA_Phone{

    private Logger logger =  Logger.getLogger("ConcreteProductA1_Iphone_Log");

    public ConcreteProductA1_Iphone() {
        logger.info("抽象工廠 ==> 蘋果手機被建立ConcreteProductA1_Iphone");
    }
}

  

package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;

import java.util.logging.Logger;

/**
 * 產品A 手機類 聯想家族 ==> 聯想手機
 * @auther mynawang
 * @create 2016-12-29 10:41
 */
public class ConcreteProductA2_Lenove implements ProductA_Phone{

    private Logger logger =  Logger.getLogger("ConcreteProductA2_Lenove_Log");

    public ConcreteProductA2_Lenove() {
        logger.info("抽象工廠 ==> 聯想手機被建立ConcreteProductA2_Lenove");
    }
}

  

package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;

import java.util.logging.Logger;

/**
 * 產品A 手機類 小米家族 ==> 小米手機
 * @auther mynawang
 * @create 2016-12-29 10:41
 */
public class ConcreteProductA3_Xiaomi implements ProductA_Phone{

    private Logger logger =  Logger.getLogger("ConcreteProductA3_Xiaomi_Log");

    public ConcreteProductA3_Xiaomi() {
        logger.info("抽象工廠 ==> 小米手機被建立ConcreteProductA3_Xiaomi");
    }
}

  

package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;

import java.util.logging.Logger;

/**
 * 產品B 電腦類 蘋果家族 ==> 蘋果電腦
 * @auther mynawang
 * @create 2016-12-29 10:42
 */
public class ConcreteProductB1_MacBook implements ProductB_Computer {

    private Logger logger =  Logger.getLogger("ConcreteProductB1_MacBook_Log");

    public ConcreteProductB1_MacBook() {
        logger.info("抽象工廠 ==> 蘋果電腦被建立ConcreteProductB1_MacBook");
    }
}

  

package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;

import java.util.logging.Logger;

/**
 * 產品B 電腦類 聯想家族 ==> 聯想電腦
 * @auther mynawang
 * @create 2016-12-29 10:42
 */
public class ConcreteProductB2_ThinkPad implements ProductB_Computer {

    private Logger logger =  Logger.getLogger("ConcreteProductB2_ThinkPad_Log");

    public ConcreteProductB2_ThinkPad() {
        logger.info("抽象工廠 ==> 聯想電腦ThinkPad被建立ConcreteProductB2_ThinkPad");
    }
}

  

package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;

import java.util.logging.Logger;

/**
 * 產品B 電腦類 小米家族 ==> 小米電腦
 * @auther mynawang
 * @create 2016-12-29 10:42
 */
public class ConcreteProductB3_XiaomiAir implements ProductB_Computer {

    private Logger logger =  Logger.getLogger("ConcreteProductB3_XiaomiAir_Log");

    public ConcreteProductB3_XiaomiAir() {
        logger.info("抽象工廠 ==> 小米筆記本Air被建立ConcreteProductB3_XiaomiAir");
    }

}

  

package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;

/**
 * 抽象工廠(一組用於建立一族產品的方法,一個方法對應一類產品)
 * @auther mynawang
 * @create 2016-12-29 10:43
 */
public interface Factory {

    ProductA_Phone createProductA();

    ProductB_Computer createProductB();
}

  

package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;

/**
 * 具體工廠(蘋果公司工廠,用於生產蘋果家族的產品)
 * @auther mynawang
 * @create 2016-12-29 10:43
 */
public class Factory1_Apple implements Factory{


    @Override
    public ProductA_Phone createProductA() {
        return new ConcreteProductA1_Iphone();
    }

    @Override
    public ProductB_Computer createProductB() {
        return new ConcreteProductB1_MacBook();
    }
}

  

package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;

/**
 * 具體工廠(聯想公司工廠,用於生產聯想家族的產品)
 * @auther mynawang
 * @create 2016-12-29 10:44
 */
public class Factory2_Lenove implements Factory {
    @Override
    public ProductA_Phone createProductA() {
        return new ConcreteProductA2_Lenove();
    }

    @Override
    public ProductB_Computer createProductB() {
        return new ConcreteProductB2_ThinkPad();
    }
}

  

package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;

/**
 * 具體工廠(小米公司工廠,用於生產小米家族的產品)
 * @auther mynawang
 * @create 2016-12-29 10:44
 */
public class Factory3_Xiaomi implements Factory {
    @Override
    public ProductA_Phone createProductA() {
        return new ConcreteProductA3_Xiaomi();
    }

    @Override
    public ProductB_Computer createProductB() {
        return new ConcreteProductB3_XiaomiAir();
    }
}

  

package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;

/**
 * 產品A(一類產品 手機)接口
 * @auther mynawang
 * @create 2016-12-29 10:39
 */
public interface ProductA_Phone {
}

  

package com.sedion.mynawang.Chapter02_AbstractFactoryPattern;

/**
 * 產品B(一類產品 電腦)接口
 * @auther mynawang
 * @create 2016-12-29 10:39
 */
public interface ProductB_Computer {
}

  

package com.sedion.mynawang;

import com.sedion.mynawang.Chapter02_AbstractFactoryPattern.*;

/**
 * 抽象工廠模式測試
 * @auther mynawang
 * @create 2016-12-29 11:02
 */
public class Chapter02_AbstractFactoryPattern_test {

    public static void main(String[] args) {
        Factory factory1 = new Factory1_Apple();
        factory1.createProductA();
        factory1.createProductB();

        Factory factory2 = new Factory2_Lenove();
        factory2.createProductA();
        factory2.createProductB();

        Factory factory3 = new Factory3_Xiaomi();
        factory3.createProductA();
        factory3.createProductB();
    }
}

  

 

// 打印結果

Connected to the target VM, address: '127.0.0.1:54302', transport: 'socket'
十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductA1_Iphone <init>
信息: 抽象工廠 ==> 蘋果手機被建立ConcreteProductA1_Iphone
十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductB1_MacBook <init>
信息: 抽象工廠 ==> 蘋果電腦被建立ConcreteProductB1_MacBook
十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductA2_Lenove <init>
信息: 抽象工廠 ==> 聯想手機被建立ConcreteProductA2_Lenove
十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductB2_ThinkPad <init>
Disconnected from the target VM, address: '127.0.0.1:54302', transport: 'socket'
信息: 抽象工廠 ==> 聯想電腦ThinkPad被建立ConcreteProductB2_ThinkPad
十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductA3_Xiaomi <init>
信息: 抽象工廠 ==> 小米手機被建立ConcreteProductA3_Xiaomi
十二月 29, 2016 8:36:24 下午 com.sedion.mynawang.Chapter02_AbstractFactoryPattern.ConcreteProductB3_XiaomiAir <init>
信息: 抽象工廠 ==> 小米筆記本Air被建立ConcreteProductB3_XiaomiAir

Process finished with exit code 0

  

抽象工廠模式優勢

1.增長新的具體工廠和產品族很方便,無需修改功能,只要新加相應的產品族便可,符合「開閉原則」。編程

2.全部具體工廠都實現了抽象工廠中定義的公共接口,所以只需改變具體工廠的實例,就能夠在某種程度上改變整個軟件系統的行爲。socket

抽象工廠模式缺點

當增長新的產品等級結構(產品種類)時很麻煩,須要調整抽象類以及全部的具體實現類,會帶來很大的不便。具備開閉原則的傾斜性。ide

抽象工廠模式應用

java.util.Calendar#getInstance()
java.util.Arrays#asList()
java.sql.DriverManager#getConnection()
java.sql.Connection#createStatement()
java.sql.Statement#executeQuery()

樣例代碼訪問地址:https://github.com/mynawang/Design-Pattern-Learning/tree/master/src/main/java/com/sedion/mynawang/Chapter02_AbstractFactoryPattern測試

博主自白

    本人20有餘,天資愚鈍,深信勤能補拙。酷愛編程,愛鑽研,廣交碼友,耕於三線,日以繼夜而使飛燕之身蛻變爲大腹便便。spa


有志之士點擊連接加入技術交流羣【專一的程序猿】282087535


    文章若是對你有所幫助是個人榮幸,不妥之處但願指正,轉帖請註明本文出自鈺火的小棧(http://www.mynawang.com/),請尊重他人的辛勤勞動成果,謝謝!

相關文章
相關標籤/搜索