1. 程式人生 > >設計模式(一) 抽象工廠(Abstract Factory)

設計模式(一) 抽象工廠(Abstract Factory)

1.定義

抽象工廠是一種常用的物件建立型設計模式。抽象工廠模式提供了一種方式,可以將一組具有統一主題的單獨工廠封裝起來,它提供一個建立一系列相關或相互依賴物件的介面,而無需制定它們具體的類。

2.結構

抽象工廠的結構圖如下所示:


AbstractFactory : 宣告一個建立抽象產品物件的操作介面

ConcreteFactory : 實現建立具體產品物件的操作

AbstractProduct : 為一個類產品物件宣告一個介面

ConcreteProduct : 定義一個將被相應的具體工廠建立產品的物件,實現AbstractProduct

Client : 僅使用由AbstractFactory和AbstractProduct類宣告的介面

3.適用性

  • 一個系統要獨立於它的產品的建立、組合、表示時
  • 一個系統要有多個產品系列中的一個類配置時
  • 當你要強調一系列相關的產品物件的設計以便進行聯合使用時
  • 當你提供一個產品類庫,而只想顯示他們的介面而不是實現時

舉個例子說明下,我們定義一個Factory介面,它有createMessageMethod和createPayMethod兩個方法,分別表示建立通訊方式和建立支付方式。然後定義三個實現Factory介面的類:AliFactory, BaiduFactory, TecentFactory, 在三個類中重寫createMessageMethod和createPayMedthod,分別返回每家公司對應的通訊方式/支付方式的物件。然後建立MessageMeans和PayMethod介面,用於獲取通訊方式和支付方式,再分別定義三個類實現這兩個介面,定義每家公司對應的實現方式資訊。下面請看原始碼:

Factory.java:

interface Factory {
	MessageMeans createMessageMethod();
	PayMethod createPayMethod();
}
AliFactory.java
public class AliFactory implements Factory {

	@Override
	public MessageMeans createMessageMethod() {
		// TODO Auto-generated method stub
		return new AliMessageMeans();
	}

	@Override
	public PayMethod createPayMethod() {
		// TODO Auto-generated method stub
		return new AliPayMethod();
	}

}
BaiduFactory.java
public class BaiduFactory implements Factory {

	@Override
	public MessageMeans createMessageMethod() {
		// TODO Auto-generated method stub
		return new BaiduMessageMeans();
	}

	@Override
	public PayMethod createPayMethod() {
		// TODO Auto-generated method stub
		return new BaiduPayMethod();
	}

}
TecentFactory.java
public class TecentFactory implements Factory{

	@Override
	public MessageMeans createMessageMethod() {
		// TODO Auto-generated method stub
		return new TecentMessageMeans();
	}

	@Override
	public PayMethod createPayMethod() {
		// TODO Auto-generated method stub
		return new TecentPayMethod();
	}

}
MessageMeans.java
public interface MessageMeans {
	void getMessageMeans();
}
AliMessageMeans.java
public class AliMessageMeans implements MessageMeans {

	@Override
	public void getMessageMeans() {
		// TODO Auto-generated method stub
		System.out.println("MessageMeans:來往");
	}

}

BaiduMessageMeans.java
public class BaiduMessageMeans implements MessageMeans {
	
	@Override
	public void getMessageMeans() {
		// TODO Auto-generated method stub
		System.out.println("MessageMeans:百度Hi");
	}

}
TecentMessageMeans.java
public class TecentMessageMeans implements MessageMeans {

	@Override
	public void getMessageMeans() {
		// TODO Auto-generated method stub
		System.out.println("MessageMeans:微信");
	}

}
PayMethod.java
interface PayMethod {
	void getPaymentMethod();
}

AliPayMethod.java
public class AliPayMethod implements PayMethod {

	@Override
	public void getPaymentMethod() {
		// TODO Auto-generated method stub
		System.out.println("PaymentMethod:支付寶");
	}

}

BaiduPayMethod.java
public class BaiduPayMethod implements PayMethod {

	@Override
	public void getPaymentMethod() {
		// TODO Auto-generated method stub
		System.out.println("PaymentMethod:百度錢包");
	}

}
TecentPayMethod.java
public class TecentPayMethod implements PayMethod {

	@Override
	public void getPaymentMethod() {
		// TODO Auto-generated method stub
		System.out.println("PaymentMethod:微信支付");
	}

}

看了這麼多原始碼,是不是有點頭暈~~,其實他們的關係也不是很複雜,我們來理一理:

下面讓我們來測試一下功能:

TestFactory

public class TestFactory {
	
	private static void testFactory(Factory factory){
		MessageMeans messageMeans = factory.createMessageMethod();
		PayMethod paymenMethod = factory.createPayMethod();
		messageMeans.getMessageMeans();
		paymenMethod.getPaymentMethod();
	}
	
	public static void main(String[] args) {
		Factory factory1 = new AliFactory();
		Factory factory2 = new BaiduFactory();
		Factory factory3 = new TecentFactory();
		testFactory(factory1);
		testFactory(factory2);
		testFactory(factory3);
		
	}
}
控制檯輸出:
MessageMeans:來往
PaymentMethod:支援寶
MessageMeans:百度Hi
PaymentMethod:百度錢包
MessageMeans:微信
PaymentMethod:微信支付
從測試中我們可以看到,ConcreteFactory(AliFactory, BaiduFactory, TecentFactory)負責建立產品的物件,隱藏了產品物件的實現細節,實現了客戶與產品的實現的分離。還有一個ConcreteFactory僅在應用中出現一次,即在其初始化的時候,這使得改變一個應用的具體工廠很容易,比如我們這樣寫
Factory factoryX = new XiaomiFactory();
只要改一行程式碼就可以更換工廠物件。但是,AbstractFactory難以支援新品種的產品,這是因為AbstractFactory介面確定了可以被建立的產品集合,支援新種類的產品就需要擴充套件該工廠介面,這將涉及AbstractFactory及其所有子類的改變。

參考文獻:



相關推薦

設計模式 抽象工廠(Abstract Factory)

1.定義 抽象工廠是一種常用的物件建立型設計模式。抽象工廠模式提供了一種方式,可以將一組具有統一主題的單獨工廠封裝起來,它提供一個建立一系列相關或相互依賴物件的介面,而無需制定它們具體的類。 2.結構 抽象工廠的結構圖如下所示: AbstractFactory : 宣告一個

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

開始 line andro 依賴 red 單例 clas 面向接口 抽象工廠方法 設計模式(0)簡單工廠模式 設計模式(1)單例模式(Singleton) 設計模式(2)工廠方法模式(Factory Method) 源碼地址 0 抽象工廠模式簡介 0.0 抽象工廠模式定義

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

ava des 模式 println 5.5 mage test 抽象工廠 urn 1、 簡介:為創建一組相關或相互依賴的對象提供一個接口,無需指定它們的具體類。抽象工廠模式通常是用於創創建一族產品,並且這族產品分不同的等級;不同的具體工廠類生產不同等級的一族產品。 2、

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

運算符 聯合 hashmap nal 消息 main 抽象 code i++ 1.描述 提供一個一系列或相互依賴對象的接口,而無需指定他們具體的類。 2.模式的使用 ·抽象產品(Product):一個抽象類或接口,負責定義具體產品必須實現的方法。 ·具體產品(Concret

設計模式—— 簡單工廠

echart 調用 抽象 簡單工廠模式 客戶端 工廠類 info 工具 crete 簡單工廠 簡介 簡單工廠模式屬於創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是一個工廠對象決定創建出哪一種

磊哥學設計模式抽象工廠模式

抽象工廠 什麼是抽象工廠 抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。 在抽象工廠模式中,介面是負責建立一個相關物件的工廠,不需要

設計模式 抽象工廠模式

在有道雲筆記上寫的,抽象工廠模式 http://note.youdao.com/noteshare?id=684ceb68fafe75e7f2b273d0460e8420&sub=0540A1F277B245A494CB02E223440771 抽象工廠模式:提供一個建立一系列相

C#設計模式3——抽象工廠模式

1.抽象工廠模式介紹   上一篇我們瞭解了工廠模式,知道工廠模式可以解決簡單工廠的缺陷(簡單工廠新增新產品時要修改工廠類,不符合開閉原則),但是簡單工廠和工廠模式都是隻生產一種產品(前邊的簡單工廠和工廠都只生產滑鼠),實際上戴爾和惠普公司不僅生產滑鼠還生產鍵盤,為了解決系列產品的問題,就有了抽象工廠模式。我

設計模式簡單工廠模式

先來考慮一道題目: 請用C++、Java、C#或VB.NET任意一種面嚮物件語言實現一個計算器控制檯程式,要求輸入兩個數和運算子號,得到結果。 題目很簡單,我們腦海裡已經有了初步的思路和答案,寫出來可能是這樣的: class Program { static vo

一個故事貫穿設計模式抽象工廠模式

    包結構:             類結構:                             實現程式碼: package com.automannn.design_mode.abstract_factory.test; import com.

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

前面說了兩種設計模式,簡單工廠模式和工廠模式。簡單工廠模式是定義一個工廠類,工廠類根據呼叫時傳入的引數選擇建立哪一個類的例項。工廠模式是為每個類建立一個工廠,而這些工廠都實現了同一個工廠,客戶端在呼叫的

設計模式十三抽象工廠模式

資料訪問的程式碼?(以“新增使用者”和“得到使用者”為例。) 最基本的資料訪問程式 使用者類, 假設只有ID和Name兩個欄位,其餘省略: class User{ private int _id; public int ID{ get

設計模式——簡單工廠工廠方法的異同

一、簡單工廠 1.定義: 簡單工廠模式(Simple Factory  Pattern):又稱為靜態工廠方法(Static Factory Method)模式。它屬於類建立型模式,在簡單工廠模式中,可以根據引數的不同返回不同型別的例項。簡單工廠模式專門定義一個類來負責建立其他的

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

推薦閱讀:  我的CSDN  我的部落格園  QQ群:704621321       在工廠模式中,一個工廠只能建立一種產

大話設計模式簡單工廠模式

簡單工廠模式就是解決不同場景下例項化物件的問題。 問題場景:做一個簡單的計算器功能,實現加減乘除的功能,要實現這個功能很簡單,但是卻又要使用到面向物件的方法,降低程式的耦合度,符合開閉原則,就沒有想象中那麼簡單,demo如下: 首先建立一個抽象的父類 Calculate,

C# 設計模式簡單工廠模式unity演示

目錄   近來打算過一下設計模式那就從簡單工廠模式開始吧。而使用設計模式就是為了提高“可維護”、“可複用”、“可擴充套件”來展開的。工廠模式可分為三類,即:簡單工廠模式、工廠模式和抽象工廠模式。 一、簡單工廠模式 1、簡單工廠模式(S

Spring中的設計模式工廠模式

一、工廠模式 場景:以牛奶為例,有蒙牛、伊利、愛慕希等品牌。 public interface Milk { /** * 獲得一種牛奶產品 * @return */ String getName(); } 產品實現介面:

設計模式5抽象工廠模式

如果 trac 一個 定義 pan 成員 oid c-c 數量 抽象工廠,提供一個工廠接口,用於創建依賴對象的家族,不需要明確指定具體類。可以理解是多個工廠方法的組合。 例如一個款手機是有電池、相機、處理器、屏幕組成的,它其中包含了不同的對象,我們創建時需要創建多個不同類

設計模式與XML抽象工廠和反射機制(C++)

一、實驗目的及要求 1、掌握建立型模式的概念。 2、掌握工廠模式、抽象工廠模式、單例模式、建造者模式、原型模式的構造方式及使用情景。 二、實驗裝置(環境) 1、   軟體需求: Dev-Cpp5.4, Rational Rose / Microsoft Visio

設計模式講解與程式碼實踐——抽象工廠

摘要:本文講解了抽象工廠(Abstract Factory)設計模式的使用目的、基本形態及各參與者,並結合示例程式碼,講解了該設計模式在具體業務場景下的使用。 1 目的 抽象工廠(Abstract Factory)用於提供一個建立一組無需指定具體類的