《Head First 設計模式》-抽象工廠模式C++實現
問題需求與工廠模式一樣,用到了抽象工廠模式----提供一個介面,用於建立相關或依賴物件的家族,而不需要制定具體的類。允許客戶使用抽象的介面來建立一組相關的產品,而不需要知道或關心實際產出的具體產品是什麼。實現客戶和具體產品的解耦。即是披薩店和具體的披薩工廠解耦,用一個抽象類原料工廠實現產品的例項化。
抽象原料工廠類
產品類/******************************/ /*原料工廠*/ /*****************************/ #ifndef INGREDIENTFACTORY_H_ #define INGREDIENTFACTORY_H_ #include<iostream> #include<string> #include<vector> using namespace std; //抽象工廠介面類 class IngredientFactory{ public: virtual string createDough() = 0; virtual string createSauce() = 0; virtual string createCheese() = 0; virtual vector<std::string> createVeggies() = 0; virtual string createPepperoni() = 0; virtual string createClam() = 0; }; class NYIngredientFactory:public IngredientFactory{ public: std::string createDough(){ cout << "製作薄的硬殼麵糰" << endl; return "Thin Crust Dough"; } std::string createSauce(){ cout << "製作Marinara醬汁" << endl; return "Marinara Sauce"; } std::string createCheese(){ cout << "製作Reggiano乳酪" << endl; return "Reggiano Cheese"; } std::vector<std::string> createVeggies(){ std::vector<std::string> temp; temp.push_back("Garlic"); temp.push_back("Onion"); temp.push_back("Mushroom"); temp.push_back("Redpepper"); cout << "新增蔬菜-洋蔥,蘑菇,紅辣椒" << endl; return temp; } std::string createPepperoni(){ cout << "製作辣椒絲" << endl; return "Sliced Pepperoni"; } std::string createClam(){ cout << "清洗蛤蜊" << endl; return "Fresh Clams"; } }; #endif
#ifndef PIZZA_H_ #define PIZZA_H_ #include<string> #include<iostream> #include"IngredientFactory.h" using namespace std; class Pizza{ private: string name; string dough; string sauce; vector<string> veggies; string cheese; string pepperoni; string clam; public: Pizza(){} virtual ~Pizza(){} void setName(string& temp){ name = temp; } void setDough(string& temp){ dough = temp; } void setSauce(string& temp){ sauce = temp; } void setVeggies(vector<string>& temp){ veggies = temp; } void setCheese(string& temp){ cheese = temp; } void setPepperoni(string& temp){ pepperoni = temp; } void setClam(string& temp){ clam = temp; } virtual void prepare()=0; virtual void bake(){ cout << "在350度烘烤25分鐘" << endl; } virtual void cut(){ cout << "切成斜片" << endl; } virtual void box(){ cout << "用正規包裝袋" << endl; } virtual string getName(){ return name; } }; class CheesePizza :public Pizza{ public: CheesePizza(IngredientFactory* temp_factory){ factory = temp_factory; } void prepare(){ cout << "正在準備" << getName() << endl; setDough(factory->createDough()); setSauce(factory->createSauce()); setCheese(factory->createCheese()); } private: IngredientFactory* factory; }; class ClamPizza :public Pizza{ public: ClamPizza(IngredientFactory* temp_factory){ factory = temp_factory; } void prepare(){ cout << "正在準備" << getName() << endl; setDough(factory->createDough()); setSauce(factory->createSauce()); setCheese(factory->createCheese()); setClam(factory->createClam()); } private: IngredientFactory* factory; }; #endif
客戶類(披薩店)只寫了一個紐約披薩店
#ifndef PIZZASTORE_H_ #define PIZZASTORE_H_ #include"pizza.h" enum PizzaType{ cheese = 0, pepperoni, clam, veggie };//Pizaa型別 class PizzaStore{ public: Pizza* orderPizza(PizzaType type){ Pizza* temp_pizza; temp_pizza = createPizza(type); temp_pizza->prepare(); temp_pizza->bake(); temp_pizza->cut(); temp_pizza->box(); return temp_pizza; } virtual Pizza* createPizza(PizzaType type) = 0; }; class NYPizzaStore :public PizzaStore{ public: Pizza* createPizza(PizzaType type){ Pizza *pizza = NULL; IngredientFactory* InFactory = new NYIngredientFactory(); string str; switch (type) { case cheese: pizza = new CheesePizza(InFactory); str = "紐約風味奶油披薩"; pizza->setName(str); break; case clam: pizza = new ClamPizza(InFactory); str = "紐約風味蛤蜊披薩"; pizza->setName(str); break; /*case cheese: pizza = new NYStyleCheesePizza(); break;*/ default: std::cout << "There is not this type of pizze" << std::endl; } return pizza; } }; //class ChicagoPizzaStore :public PizzaStore{ //public: // Pizza* createPizza(PizzaType type){ // Pizza *pizza = new Pizza; // switch (type) // { // case cheese: // pizza = new ChicagoStyleCheesePizza(); // break; // /*case cheese: // pizza = new NYStyleCheesePizza(); // break; // case cheese: // pizza = new NYStyleCheesePizza(); // break;*/ // default: // std::cout << "There is not this type of pizze" << std::endl; // } // return pizza; // } //}; #endif
主函式測試
#include"IngredientFactory.h"
#include"Pizza.h"
#include"PizzaStore.h"
int main()
{
cout << "-----小明的訂單-----" << endl;
PizzaStore* nyPizzaStore = new NYPizzaStore();
nyPizzaStore->orderPizza(cheese);
nyPizzaStore->createPizza(cheese);
cout << endl;
cout << endl;
cout << "-----小紅的訂單-----" << endl;
//PizzaStore* nyPizzaStore = new NYPizzaStore();
nyPizzaStore->orderPizza(clam);
nyPizzaStore->createPizza(clam);
return 0;
}
執行結果
工廠方法和抽象工廠方法都是負責建立物件,工廠方法是利用繼承建立,抽象工廠方法是利用的物件組合。
工廠方法通過子類建立物件,客戶只需知道他們所使用的抽象型別就可以然後由子類負責決定具體型別,實現了客戶和具體型別中解耦。
抽象工廠方法提供一個用來建立產品家族的抽象型別,這個型別的子類定義了產品被產生的方法。要想使用這個工廠,必須要先例項化它,然後將它傳入一些針對抽象型別寫的程式碼中,實現客戶和具體產品的解耦。
最後說一下抽象工廠模式的設計原則:依賴抽象,不依賴具體類。
需要再看,雖然程式碼寫完了,但依舊感覺糊里糊塗的,總結也沒有寫清楚。
相關推薦
Head First 設計模式學習——簡單工廠方法-工廠方法模式-抽象工廠模式
設計模式是進階高階開發的必經之路。 工廠方法模式(Factory Method Pattern)是《Head First 設計模式》介紹的第四個模式,只要你認真讀完本篇博文,一定能很好地掌握此模式。 定義 工廠方法模式通過讓子類決定該建立的
設計模式——抽象工廠模式(C++實現)
concrete out png return style bsp ctp img using 1 #include <iostream> 2 #include <string> 3 4 usin
C# - 設計模式 - 抽象工廠模式
tel 總結 num provider ndb back reat param [] 抽象工廠模式 問題場景 有100個方法對Animal類型進行了引用,所以可能需要new100次Animal對象,如果總是使用new創建對象,那麽100處都會有對該對象的引用。假如今後A
C#設計模式-抽象工廠模式
using System; namespace TestCS { class Program { static void Main(string[] args) { Factory factory0 = new Maserat
C++設計模式——抽象工廠模式(含例項)
前言 偉創力(世界500強企業),公司有筆記本生產車間、電視機車間、空調車間、電話生產等車間,各生產車間各行其責,生產出不同型別的產品。偉創力不再是生產單一產品的企業,而是生產出多種不同型別的產品,各產品屬於不同產品等級結構中。在設計模式中,也存在一種類似的模式,可以建
C# 設計模式----抽象工廠模式
一、引言在上一專題中介紹了工廠方法模式,工廠方法模式是為了克服簡單工廠模式的缺點而設計出來的,簡單工廠模式的工廠類隨著產品類的增加需要增加額外的程式碼),而工廠方法模式每個具體工廠類只完成單個例項的建立,所以它具有很好的可擴充套件性。但是在現實生活中,一個工廠只建立單個產品這
C++設計模式---抽象工廠模式
定義了一個建立一系列相關或相互依賴的介面,而無需制定它們的具體類。用於交換產品系列,產品的具體類名被具體工廠實現分離簡單來說就是,工廠還是兩個,可以生產A系列的產品,B系列的產品//抽象工廠模式 cla
設計模式—抽象工廠模式
elm 步驟 cli 優點 abstract 工程師 face abs ges 場景問題 舉個生活中常見的例子——組裝電腦,我們在組裝電腦的時候,通常需要選擇一系列的配件,比如CPU、硬盤、內存、主板、電源、機箱等。 需要整體考慮各個配件之間的兼容性。比如:CPU和主板,如
設計模式 - 抽象工廠模式
查看 rgs llc cli pri class print ace 分享 public interface CPU { } public class AmdCPU implements CPU{ public AmdCPU() { Syste
創造型設計模式-----抽象工廠模式
sin mage pub gin bubuko 概念 .cpp col alt 一種商品需要用多個產品組成就需要運用抽象工廠模式。 概念: 抽象工廠:聲明一個用於完成抽象商品對象創建操作的接口 具體工廠:實現創建具體產品對象的操作 抽象產品:聲明一個用於一類產品對象的接口
設計模式-抽象工廠模式
抽象工廠模式 設計模式 public class UserEntity { public int ID { get; set; } public string Name { get; set; } } public interface IUser
pyhon面向對象設計之抽象工廠模式
python 面向對象 抽象工廠模式 簡介 抽象工廠設計模式屬於創建型設計模式的一種,創建型設計模式更關註對象是如何被創建出來的。通常我們會調用對象的構造函數來創建對象實例,比如通過向類名稱傳遞相關參數來創建。但是,有時候我們會需要更加靈活的對象創建方式,這時創建型的設計模式就會大有用處了。今天
PHP設計模式 - 抽象工廠模式
抽象工廠 com 對象 creates 我們 ace {} create clas 有些情況下我們需要根據不同的選擇邏輯提供不同的構造工廠,而對於多個工廠而言需要一個統一的抽象工廠: <?php class System{} class Soft{
【設計模式】簡單工廠模式 |工廠方法模式 |抽象工廠模式
簡單工廠模式 由三種角色組成: 1、工廠類角色:是簡單工廠模式的核心,含有一定的商業邏輯和判斷邏輯。 2、抽象產品角色:一般是具體產品繼承的父類或者實現的介面。 3、具體產品角色:工廠類所建立的物件就是此角色的例項。 用一個單獨的類來做這個創在例項的過程,這就
android設計模式——抽象工廠模式
定義:為建立一組相關或者是互相以來的物件提供一個介面,而不需要指定他們的具體的類, 使用場景: 在任何需要生成複雜物件的地方,都可以使用工廠方法模式. 應用舉例: 不同牌子的汽車工廠生產不同的汽車 類圖: AbstractFactory,抽象的工廠類 Concrete
java常用設計模式--抽象工廠模式簡單例子
package com.ruanyun;/** * @Auther: maxw * @Date: 2018/11/12 11:23 * @Description:抽象工廠模式:與工廠方法模式不同的是,工廠方法模式中的工廠只生產單一的產品,而抽象工廠模式中的工廠生產多個產品。 * 還有個抽象工廠方法模式 只需要
用心理解設計模式——抽象工廠模式 (Abstract Factory Pattern)
前置文章: 用心理解設計模式——設計模式的原則 設計模式相關程式碼已統一放至 我的 Github 一、定義 建立型模式之一。 Provide an interface for creating families of
設計模式 --- 抽象工廠模式
1.定義 為建立一組相關或者相互依賴的物件提供一個介面,而不需要指定他們的具體類。 2.使用場景 一個物件族有相同的約束時可以使用抽象工廠模式。例如之前工廠方法模式的汽車組裝例子,Q3、Q5、Q7都是同一個車系,但是零部件差別很大,Q3發動機是國產的而Q7是原裝進口的,
設計模式-抽象工廠模式(Abstract Factory)
概述 定義 : 抽象工廠提供一個建立一系列相關或相互依賴物件的介面 無需指定它們具體的類 型別 : 建立型設計模式 適用場景 客戶端不依賴於產品例項如何被建立, 實現等細節 強調一系列相關的產品物件(屬於同一產品組)一起使用
Java設計模式-簡單工廠模式/工廠模式/抽象工廠模式
目錄 簡單工廠模式 工廠模式 抽象工廠模式 上述程式碼 GitHub 地址:https://github.com/baicun/designPatterns 共同點:建立一個類,對同樣操作的方法介面進行封裝,類似工廠管理生產線等情形。 優點:方便管理,易於拓展。 應用