1. 程式人生 > >【Java設計模式】抽象工廠

【Java設計模式】抽象工廠

簡介: 

    當每個抽象產品都有多於一個的具體子類的時候,工廠角色怎麼知道例項化哪一個子類呢?比如每個抽象產品角色都有兩個具體產品。抽象工廠模式提供兩個具體工廠角色,分別對應於這兩個具體產品角色,每一個具體工廠角色只負責某一個產品角色的例項化。每一個具體工廠類只負責建立抽象產品的某一個具體子類的例項。
每一個模式都是針對一定問題的解決方案,工廠方法模式針對的是一個產品等級結構;而抽象工廠模式針對的是多個產品等級結構。

1. 定義

為建立一組相關或相互依賴的物件提供一個介面,而且無需指定他們的具體類。

2. 解決的問題

系統不依賴於產品類例項如何被建立,組合和表達的細節。

系統的產品有多於一個的產品族,而系統只消費其中某一族的產品(抽象工廠模式的原始用意Unix&Windows)
Button--->UnixButton/WinButton
Text----->UnixText/WinText
Unix產品族和Windows產品族,不會同時使用。
Factory--->UnixFactory/WinFactory

同屬於同一個產品族是在一起使用的。這一約束必須在系統的設計中體現出來。

系統提供一個產品類的庫,所有產品以同樣的接口出現,從而使客戶端不依賴於實現。

3. 例子

類圖


package build.factory.abstractf;
/**
 * @Author: bufoon
 * @Email: [email protected]
 * @Datetime: Created In 2018/4/7 9:46
 * @Desc: as follows.
 *  定義:為建立一組相關或相互依賴的物件提供一個介面,而且無需制定他們的具體類
 *  在實際的生產過程中,一件產品大多都是由多個廠商生產,然後再組裝到一起的
 *  所以一雙鞋包括:鞋體,刀架,輪子,內膽,配件等
 *  其中我們就以配件來舉例
 *  配件包括 鞋帶,扒扣,能量帶等
 */
public interface AbstractFactory {
    // 建立鞋帶
    Lace createLace();
    // 建立能量帶
    EnergyTape createEnergyType();
}


package build.factory.abstractf;

/**
 * @Author: bufoon
 * @Email: [email protected]
 * @Datetime: Created In 2018/4/7 10:41 
 * @Desc: as follows. 
 * 
 */
public class BlackFactory implements AbstractFactory {
    @Override
    public Lace createLace() {
        return new BlackLace();
    }

    @Override
    public EnergyTape createEnergyType() {
        return new BlackEnergyTape();
    }
}
package build.factory.abstractf;

/**
 * @Author: bufoon
 * @Email: [email protected]
 * @Datetime: Created In 2018/4/7 10:41 
 * @Desc: as follows. 
 * 
 */
public class RedFactory implements AbstractFactory {
    @Override
    public Lace createLace() {
        return new RedLace();
    }

    @Override
    public EnergyTape createEnergyType() {
        return new RedEnergyTape();
    }
}
package build.factory.abstractf;

/**
 * @Author: bufoon
 * @Email: [email protected]
 * @Datetime: Created In 2018/4/7 10:41 
 * @Desc: as follows. 
 * 
 */
public interface Lace {
    String getName();
}
package build.factory.abstractf;

/**
 * @Author: bufoon
 * @Email: [email protected]
 * @Datetime: Created In 2018/4/7 10:41 
 * @Desc: as follows. 
 * 
 */
public interface EnergyTape {
    String getName();
}
package build.factory.abstractf;

/**
 * @Author: bufoon
 * @Email: [email protected]
 * @Datetime: Created In 2018/4/7 10:41 
 * @Desc: as follows. 
 * 
 */
public class RedLace implements Lace {
    @Override
    public String getName() {
        return "紅色鞋帶";
    }
}
package build.factory.abstractf;

/**
 * @Author: bufoon
 * @Email: [email protected]
 * @Datetime: Created In 2018/4/7 10:41 
 * @Desc: as follows. 
 * 
 */
public class BlackLace implements Lace {
    @Override
    public String getName() {
        return "黑色鞋帶";
    }
}
package build.factory.abstractf;

/**
 * @Author: bufoon
 * @Email: [email protected]
 * @Datetime: Created In 2018/4/7 10:41 
 * @Desc: as follows. 
 * 
 */
public class RedEnergyTape implements EnergyTape {
    @Override
    public String getName() {
        return "紅色能量帶";
    }
}
package build.factory.abstractf;

/**
 * @Author: bufoon
 * @Email: [email protected]
 * @Datetime: Created In 2018/4/7 10:41 
 * @Desc: as follows. 
 * 
 */
public class BlackEnergyTape implements EnergyTape {
    @Override
    public String getName() {
        return "黑色能量帶";
    }
}
package build.factory.abstractf;

/**
 * @Author: bufoon
 * @Email: [email protected]
 * @Datetime: Created In 2018/4/7 10:41
 * @Desc: as follows. 
 * 
 */
public class AbstractFactoryTest {

    public static void main(String[] args) {
        AbstractFactory factory = new RedFactory();
        System.out.println("生產: " + factory.createLace().getName() + " 和 " + factory.createEnergyType().getName());

        factory = new BlackFactory();
        System.out.println("生產: " + factory.createLace().getName() + " 和 " + factory.createEnergyType().getName());
    }
}

輸出:

生產: 紅色鞋帶 和 紅色能量帶
生產: 黑色鞋帶 和 黑色能量帶

4. 思考

抽象工廠就是將一組相關的產品族用同一個工廠生成。與工廠方法有點類似包含的關係。






相關推薦

Java設計模式抽象工廠

簡介:     當每個抽象產品都有多於一個的具體子類的時候,工廠角色怎麼知道例項化哪一個子類呢?比如每個抽象產品角色都有兩個具體產品。抽象工廠模式提供兩個具體工廠角色,分別對應於這兩個具體產品角色,每一個具體工廠角色只負責某一個產品角色的例項化。每一個具體工廠類只負責建立抽象

C++設計模式抽象工廠模式

#ifndef __ABSTRACTFACTORY_H__ #define __ABSTRACTFACTORY_H__ #include <string> #include <iostream> //抽象工廠模式 //定義:抽象工廠提供一個建立一

Unity與23種設計模式抽象工廠模式(Abstract Factory)

根據 strac 結果 產品 不同 面試 public str 構建 GoF中定義: “提供一個能夠建立整個類群組或有關聯的對象,而不必指明它們的具體類。” 意思就是 根據不同的執行環境產生不同的抽象類子類 抽象工廠模式經常在面試中會涉及到 下面的例子為工廠1和

設計模式 抽象工廠模式 Abstract Factory Pattern

輸出結果 決定 操作 靜態工廠模式 void inter excel erp fault 簡單工廠模式是一個工廠類根據工廠方法的參數創建不出不同的產品, 工廠方法模式是每一個產品都有一個一一對應的工廠負責創建該產品。那麽今天要講的抽象工廠模式是一個工廠能夠產生關聯的一系列產

JAVA設計模式1.簡單工廠模式

簡單工廠模式是建立型設計模式: 建立型設計模式即封裝了具體生成物件的細節,僅暴露出生成物件的方法。只需向建立物件的方法提供引數,而不用自行實現判斷的邏輯。 UML圖(圖片來自網路): 簡單工廠模式提供了一個建立者類,暴露了一個工廠方法,用於根據接收的引數返回對應的具

設計模式——抽象工廠模式

【抽象工廠模式】 抽象工廠模式是圍繞一個超級工廠建立其他工廠,該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模型,它提供了一種建立物件的最佳方式 在抽象工廠模式中,介面是負責建立一個相關物件的工廠,不需要顯式的指定他們的類。每個生成的工廠都能按照工廠模式

設計模式抽象工廠模式

模式定義 抽象工廠模式提供一個介面,用於建立相關或依賴物件的家族,而不需要明確指定具體類。 下圖是該模式的類圖: 一個生動的例子 工廠介面: public interface PizzaIngredientFactory { public Dough createDo

重溫設計模式——從工廠方法模式抽象類和介面的區別

     引言  最近我們有集體學習了設計模式,不論是通過我們自己討論還是聽師哥師姐們的分享, 這個的收穫是非常大的,這一次學習設計模式感到非常的親切,可能是因為裡面有一些 模式在自己的專案中已經

java設計模式行為模式Behavioral Pattern策略模式Strategy Pattern

java sys algorithm stat 設計模式 log sets ace 行為模式 1 package com.tn.策略模式; 2 3 public class Client { 4 private Strategy strategy; 5

java設計模式代理模式

pro 運行時間 cli .get aggregate stopped clas cnblogs dex 計算類中方法運行時間的幾種方案: Client: 1 package com.tn.proxy; 2 3 public class Client { 4

java設計模式創建模式Creational Pattern建造模式Builder Pattern

part main ons rod over res {} retrieve [] 1 package com.tn.pattern; 2 3 public class Client { 4 public static void main(String[

JAVA設計模式外觀模式(Facade Pattern)

簡單 產生 creat ide oid dsm ref 功能 .net 一 定義 為子系統中的一組接口提供一個一致的界面。Facade模式定義了一個高層的接口,這個接口使得這一子系統更加easy使用。 二 案例 一個子系統中擁有3個模塊。每一個模塊

Java設計模式(3)——抽象工廠模式

抽象工廠模式 圖片 uml eve 實例 alt pla pub closed   抽象工廠模式是所有形態的工廠模式中最為抽象和最其一般性的。抽象工廠模式可以向客戶端提供一個接口,使得客戶端在不必指定產品的具體類型的情況下,能夠創建多個產品族的產品對象。 一、產品族和產品

java設計模式---總則

這一 三種模式 行為 協作 完成 細節 沒有 什麽 使用 設計模式總則 一、概述 1、什麽是設計模式 設計模式是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。 解釋下: 分類編目:就是說可以找到一些特征去劃分這些設計模式,從而進

Python設計模式03 工廠模式:建立建立物件的工廠

三、工廠模式:建立建立物件的工廠 工廠模式可以說是最常用的設計模式 本章主要介紹建立型設計模式:工廠模式 本章主題 瞭解簡單工廠設計模式 討論工廠方法和抽象工廠方法及其差異 利用Python 程式碼實現真實場景 討論模式的優缺點並進行相應的比較

JAVA設計模式-2-抽象工廠

抽象工廠模式圍繞一個超級工廠工作,建立其他工廠。這家工廠也被稱為工廠工廠。這種型別的設計模式屬於建立模式,因為此模式提供了建立物件的最佳方法之一。   在抽象工廠模式中,介面負責建立相關物件的工廠,而無需顯式指定其類。每個生成的工廠都可以按照工廠模式提供物件。 實現 我

JAVA設計模式9.組合模式

目錄即是最經典的組合模式實踐,一個物件由多個物件(可以是自身型別)組合而成,形成一個複雜的物件 UML圖: 首先定義一個總介面,用於定義所有元件,所有元件都實現該介面: interface IComponent { void operation();

JAVA設計模式12.享元模式

享元模式將物件資訊分為兩類,一個是不受物件具體資訊影響,即可共享的物件資訊,另一個是不同物件間獨立的資訊。 由於存在可共享的資訊,則可設計一個工廠類,工廠類內部儲存了大量物件,所有物件都有一個共同的資訊,例如:產品類別。 先建立一個享元介面: interface Fly

JAVA設計模式18.備忘錄模式

顧名思義,備忘錄模式用於當資訊發生改變時回溯回之前存在的某一個版本。 UML圖: 備忘錄類Memento,提供修改和獲得內部資訊的方法: class Memento { private String state; public Memento(St

C++設計模式簡單工廠工廠方法

#ifndef __FACTORYMETHOD_H__ #define __FACTORYMETHOD_H__ #include <iostream> #include <str