設計模式系列(三)——AbstactFactory模式
AbstactFactory模式
問題場景
假設我們設計一個遊戲,可以採用這樣一種處理策略: 為遊戲設立等級,初級、中級、高階甚至有BT 級。 假設也是過關的遊戲, 每個關卡都有一些怪物(monster) 守著, 玩家要把這些怪物幹掉才可以過關。 作為開發者, 我們就不得不建立怪物的類, 然後初級怪物、 中級怪物等都繼承自怪物類(當然不同種類的則需要另建立類,但是模式相同)。在每個關卡, 我們都要建立怪物的例項,例如初級就建立初級怪物(有很多種類)、中級建立中級怪物等。可以想象在這個系統中, 將會有成千上萬的怪物例項要建立, 問題是還要保證建立的時候不會出錯:初級不能建立 BT 級的怪物(玩家就鬱悶了,玩家一鬱悶,遊戲也就掛掛了),反之也不可以。
AbstractFactory 模式就是用來解決這類問題的:要建立一組相關或者相互依賴的物件。
AbstractFactory 模式關鍵就是將這一組物件的建立封裝到一個用於建立物件的類 (ConcreteFactory)中, 維護這樣一個建立類總比維護 n 多相關物件的建立過程要簡單的多。
實現
//Product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_
class AbstractProductA
{
public:
virtual ~AbstractProductA();
protected:
AbstractProductA ();
private:
};
class AbstractProductB
{
public:
virtual ~AbstractProductB();
protected:
AbstractProductB();
private:
};
class ProductA1:public AbstractProductA
{
public:
ProductA1();
~ProductA1();
protected:
private:
};
class ProductA2:public AbstractProductA
{
public:
ProductA2();
~ProductA2();
protected :
private:
};
class ProductB1:public AbstractProductB
{
public:
ProductB1();
~ProductB1();
protected:
private:
};
class ProductB2:public AbstractProductB
{
public:
ProductB2();
~ProductB2();
protected:
private:
};
#endif //~_PRODUCT_H_
#include "Product.h"
AbstractProductA::AbstractProductA()
{
}
AbstractProductA::~AbstractProductA()
{
}
AbstractProductB::AbstractProductB()
{
}
AbstractProductB::~AbstractProductB()
{
}
ProductA1::ProductA1()
{
cout<<"ProductA1..."<<endl;
}
ProductA1::~ProductA1()
{
}
ProductA2::ProductA2()
{
cout<<"ProductA2..."<<endl;
}
ProductA2::~ProductA2()
{
}
ProductB1::ProductB1()
{
cout<<"ProductB1..."<<endl;
}
ProductB1::~ProductB1()
{
}
ProductB2::ProductB2()
{
cout<<"ProductB2..."<<endl;
}
ProductB2::~ProductB2()
{
}
//AbstractFactory.h
#ifndef _ABSTRACTFACTORY_H_
#define _ABSTRACTFACTORY_H_
class AbstractProductA;
class AbstractProductB;
class AbstractFactory
{
public:
virtual ~AbstractFactory();
virtual AbstractProductA* CreateProductA() = 0;
virtual AbstractProductB* CreateProductB() = 0;
protected:
AbstractFactory();
private:
};
class ConcreteFactory1:public AbstractFactory
{
public:
ConcreteFactory1();
~ConcreteFactory1();
AbstractProductA* CreateProductA();
AbstractProductB* CreateProductB();
protected:
private:
};
class ConcreteFactory2:public AbstractFactory
{
public:
ConcreteFactory2();
~ConcreteFactory2();
AbstractProductA* CreateProductA();
AbstractProductB* CreateProductB();
protected:
private:
};
#endif //~_ABSTRACTFACTORY_H_
//AbstractFactory.cpp
#include "AbstractFactory.h"
#include "Product.h"
AbstractFactory::AbstractFactory()
{
}
AbstractFactory::~AbstractFactory()
{
}
ConcreteFactory1::ConcreteFactory1()
{
}
ConcreteFactory1::~ConcreteFactory1()
{
}
AbstractProductA* ConcreteFactory1::CreateProductA()
{
return new ProductA1();
}
AbstractProductB* ConcreteFactory1::CreateProductB()
{
return new ProductB1();
}
ConcreteFactory2::ConcreteFactory2()
{
}
ConcreteFactory2::~ConcreteFactory2()
{
}
AbstractProductA* ConcreteFactory2::CreateProductA()
{
return new ProductA2();
}
AbstractProductB* ConcreteFactory2::CreateProductB()
{
return new ProductB2();
}
//main.cpp
#include "AbstractFactory.h"
nt main(int argc,char* argv[])
{
AbstractFactory* cf1 = new ConcreteFactory1();
cf1->CreateProductA();
cf1->CreateProductB();
AbstractFactory* cf2 = new ConcreteFactory2();
cf2->CreateProductA();
cf2->CreateProductB();
return 0;
}
AbstractFactory 模式的實現程式碼很簡單, 在測試程式中可以看到, 當我們要建立一組物件(ProductA1, ProductA2)的時候我們只用維護一個建立物件(ConcreteFactory1),大大簡化了維護的成本和工作。
AbstractFactory 模式和 Factory 模式的區別是初學(使用)設計模式時候的一個容易引起困惑的地方。 實際上, AbstractFactory 模式是為建立一組(有多類) 相關或依賴的物件提供建立介面, 而 Factory 模式正如我在相應的文件中分析的是為一類物件提供建立介面或延遲物件的建立到子類中實現。並且可以看到, AbstractFactory 模式通常都是使用 Factory 模式實現(ConcreteFactory1)。
相關推薦
設計模式系列(三)——AbstactFactory模式
AbstactFactory模式 問題場景 假設我們設計一個遊戲,可以採用這樣一種處理策略: 為遊戲設立等級,初級、中級、高階甚至有BT 級。 假設也是過關的遊戲, 每個關卡都有一些怪物(monster) 守著, 玩家要把這些怪物幹掉才可以過關。 作為開
Java 設計模式系列(九)組合模式
ima 技術分享 client 索引 有變 int spa 初始 類型 Java 設計模式系列(九)組合模式 將對象組合成樹形結構以表示“部分-整體”的層次結構。組合模式使得用戶對單個對象的使用具有一致性。 一、組合模式結構 Component: 抽象的組件對象,為
MVVM架構模式 入門(三)MVVM模式的常用框架:MVVM Light輕量級、Prism重量級等等
轉http://www.cnblogs.com/tianciliangen/p/7890742.html 實現MVVM的框架有很多,如: • MVVM Light Toolkit: http://mvvmlight.codeplex.com • Microsoft Prism&
設計模式系列之三:工廠模式(Factory Pattern)
這是本系列的第三篇部落格,這次主要來說一下工廠模式。 基本工廠模式 簡單來說工廠模式是將工程中的相同型別物件的建立活動集中管理,一般通過反射來生成外界需要的實體類。比如Spring中的容器Bean概念,通過Spring BeanFactory來產生不同的Be
java設計模式(三)模板模式
pro str pan style coff pub 調用 類定義 ted 抽象類中公開定義了執行它的方法的方式,子類可以按需求重寫方法實現,但調用將以抽象類中定義的方式進行,典型應用如銀行辦理業務流程、沖泡飲料流程。下面給出簡單例子,用沸水沖泡飲料,分為四步:將水煮沸
設計模式(三) 工廠模式
初始化 重要 不能 還需 new 不同 參數 裏的 作用 概述: 屬於創建型設計模式,需要生成的對象叫做產品 ,生成對象的地方叫做工廠 。 使用場景: 在任何需要生成復雜對象的地方,都可以使用工廠方法模式。 直接用new可以完成的不需要用工廠模式 下面將介紹五種工廠
23種設計模式介紹(三)---- 行為型模式
不同 延遲 log 實現 其中 sta IE class 發出 由於設計模式篇幅比較大,如果在一篇文章講完所有的設計模式的話不利於閱讀。於是我把它分為三篇文章 23種設計模式介紹(一)---- 創建型模式 23種設計模式介紹(二)---- 結構型模式 23
Java 設計模式系列(五)單例模式
重要 理解 iat 版本 ide 默認 ces 內部實現 成功 Java 設計模式系列(五)單例模式 單例模式確保某個類只有一個實例,而且自行實例化並向整個系統提供這個實例。 一、懶漢式單例 /** * 懶漢式單例類.在第一次調用的時候實例化自己 * 1. 構造器私
Java 設計模式系列(六)適配器模式
建議 技術 amp (六) image 必須 一起 nts 工作 Java 設計模式系列(六)適配器模式 適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。 適配器模式的結構: 類的適配器模式 對象的
設計模式學習筆記(三)——策略模式
count forname tst code tchar 類名 適用於 動態 自由 一、概述 策略模式屬於對象的行為模式。其用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們之間可以互相替換。策略模式使得算法可以在不影響客戶端的情況下發生變化。
設計模式(三)- 狀態模式
.get TP 導致 做到 ring bubuko 對象 狀態 一個 [toc] 狀態模式 當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。 在平常開發自己也會遇到好多方法過長,裏面的判斷語句太多,導致後續修改十分麻煩。今天看到狀態模式的介紹,覺
Java設計模式簡介(三):行為型模式(上)
本章講到第三種設計模式——行為型模式,共11種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。 先來張圖,看看這11中模式的關係: 第一類:通過父類與子類的關係進行實現。第二類:兩個類之間。第三類:類的狀態。第
設計模式(三)工廠模式
簡單工廠模式違反了開放—封閉原則,工廠模式解除了其弊端 工廠方法模式,定義一個建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到子類 簡單工廠模式用switchcase在一個類中,建立相應的類,工廠模式是為每一個類建立一個例項化該類的類,例如OperationAdd
設計模式(三)---原型模式
吐槽 今天帶貓貓去打針,然後她各種皮,差點從袋子裡面跑出去了emmmmm,早上上課時候,編譯原理上上課居然就聽不懂了,很尷尬,趕緊回去補。 什麼叫原型模式 就是類似鳴人的影分身之術,可以克隆物件 定義:用原型例項指向建立物件的種類,並通過複製這些原型建立新的物件
設計模式之(三)——裝飾者模式(Decorator Pattern)
裝飾者模式:動態將責任附加到物件上,要拓展功能,提供了比繼承更有彈性的方案。 很多文章也是拿了書上的例子來講,同時寫到,有的調料裝飾者都必須實現 getDescription() 大家可以先考慮下,稍後我們會說。最後都是沒說,還有思考的
設計模式與XML(三)組合模式、橋接模式和介面卡模式(C++)
一、實驗目的及要求 1、掌握結構型模式的概念。 2、掌握介面卡模式、橋接模式、組合模式、裝飾器模式、外觀模式、享元模式、代理模式的構造方式及使用情景。 二、實驗裝置(環境) 1、 軟體需求: Dev-Cpp5.4, Rat
設計模式(三)代理模式
代理模式:一個代理角色和一個真正的角色,代理角色代替真正角色執行操作 代理模式又分為靜態代理模式和動態代理模式。 靜態代理模式: 1、首先抽象角色(參考武哥的例子) package 代理模式;
Unity3d與設計模式(三)工廠模式
這個系列的文章,並不會將所有用到的設計模式全部講一遍,事實上我個人認為,並不是所有的設計模式都適用於unity3d。這裡講的主要還是一些常用的設計模式。 那麼,本章講的就是常見的構建型模式當中的工廠模式。 簡單工廠模式 講工廠,首先得從簡單工廠說起。
HeadFirst 設計模式筆記(三)—— decorator
裝飾者模式:使用物件組合的方式在執行時給物件賦予新的功能(裝飾),而不是濫用繼承。 舉個例子就清晰了:java.io這個包中就應用了這一模式FilterInputStream是一個裝飾者類,它和它的子類可以對InputStream的其他子類進行裝飾。
PHP設計模式系列(四):工廠方法模式
工廠方法模式 工廠方法模式(Factory Method Pattern)又稱為工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多型工廠(Polymorphic Factory)模式,它屬於類建立型模式。在工廠方法模式中,工廠父類負責