黑馬C++設計模式2

簡單工廠模式

//一般來說,自己創建一個對象的方法是在自己寫的業務函數中直接new一個對象出來
//但是現實需求,我不想創建對象,我只想拿來用。(創建類的步驟比較復雜)
//好處,1、客戶端和具體實現類解耦。2、對于某些對象創建過程比較復雜情況,我們不用考慮這些了。
//壞處,1、簡單工廠模式,增加新的功能是通過源代碼實現的,不符合開閉原則。2、這個類的職責過重,這個類發生問題,會影響很多使用這個工廠模塊。
//抽象水果 class AbstractFruit{ public: virtual void ShowName() = 0; };//蘋果 class Apple:public AbstractFruit{ public:virtual void ShowName(){cout << “我是蘋果!” << endl;}};//鴨梨 class Pear:public AbstractFruit{ public:virtual void ShowName(){cout << “我是鴨梨!” << endl;} };//水果工廠 class FruitFactory{ public:static AbstractFruit* CreateFruit(string flag){if(flag == "apple"){return new Apple;}else if(flag == "pear"){return new Pear;}elsereturn NULL;} };void test1(){FruitFactory* factory = new FruitFactroy;AbstractFruit* apple = factory->CreateFruite("apple");apple->ShowName();AbstracFruit* banana = factory->CreateFruite("banana");banana->ShowName();delete factory;delete apple;delete banana;}

?

工廠方法模式

  問題,1、類的個數成倍增加,導致類越來越多,增加維護成本。

 ? ? 好處,1、符合開閉原則

  簡單工廠模式 + “開閉原則” = 工廠方法模式

?  

  優點:1,不需要記住具體類名,甚至連具體參數都不用記憶。

     2,實現了對象創建和使用的分離。

    ? ? 3,系統的可擴展性也就變得非常好,無需修改接口和原類。

  缺點:1,增加系統中類的個數,復雜度和理解度增加。

  ? ? ? ? ? ?2,增加了系統的抽象性和理解難度。

//抽象水果類
class
AbstractFruit{ public: virtual void ShowName() = 0; };//蘋果 class Apple:public AbstractFruit{ public:virtual void ShowName(){cout << “我是蘋果!” << endl;}};//鴨梨 class Pear:public AbstractFruit{ public:virtual void ShowName(){cout << “我是鴨梨!” << endl;} };
//抽象工廠類
class AbstractFruitFactory{
public:
virtual AbstractFruit* CreateFruit() = 0;
}

//蘋果工廠
class AppleFactory:public AbstractFruitFactory{
public:
virtual AbstracFruit* CreateFruit(){
return new Apple;
}
};
//鴨梨工廠
class PearFactory:public AbstractFruitFactory{
public:
virtual AbstracFruit* CreateFruit(){
return new Pear;
}
};
void test(){

AbstractFruitFactory* factory = NULL;
AbstractFruit* fruit = NULL;

//創建一個蘋果工廠
factory = new AppleFactory;
fruit = factory->CreateFruit();
fruit->ShowName();
delete factory;
delete fruit;

    //創建一個鴨梨工廠
factory = new PearFactory;
fruit = factory->CreateFruit();
fruit->ShowName();
delete factory;
delete fruit;
}

?

簡單工廠模式和工廠方法模式適用場景

  簡單工廠模式:

  1,工廠類負責創建的對象比較少,由于創建的對象較少,不會造成工廠方法中的業務邏輯太過復雜。

  2,客戶端只知道傳入工廠類的參數,對于如何創建對象不太關心。

  工廠方法模式

  1,客戶端不知道它所需要的對象的類。

  2,抽象工廠類通過其子類來指定創建哪個對象。

?

抽象工廠模式

  抽象工廠針對的是產品族,而不是產品等級結構。產品族:同一產地或者同一廠商,功能不同。產品等級:功能相同,產地或者廠商不同。

  

//抽象蘋果
class AbstractApple{
public:virtual void ShowName() = 0;
};class ChineseApple:public AbstractApple{
public:virtual void ShowName(){cout << "中國蘋果" << endl;}
};//美國蘋果
class USAApple:public AbstractApple{
public:virtual void ShowName(){cout << "美國蘋果" << endl;}
};//日本蘋果
class JapaneseApple:public AbstractApple{
public:virtual void ShowName(){cout << "日本蘋果" << endl;}
};//抽象香蕉
class AbstractBanana{
public:virtual void ShowName() = 0;
};//中國香蕉
class ChineseBanana:public AbstractBanana{
public:virtual void ShowName(){cout << "中國香蕉" << endl;}
};//美國香蕉
class USABanana:public AbstractBanana{
public:virtual void ShowName(){cout << "美國香蕉" << endl;}
};//日本香蕉
class JapaneseBanana:public AbstractBanana{
public:virtual void ShowName(){cout << "日本香蕉" << endl;}
};//抽象工廠  針對產品族
class AbstractFactory{
public:virtual AbstractApple* CreateApple() = 0;virtual AbstractBanana* CreateBanana() = 0;virtual AbstractPear* CreatePear() = 0;
};//中國工廠
class ChineseFactory:public AbstracFactory{
public:virtual AbstractApple* CreateApple() {return new ChineseApple;}virtual AbstractBanana* CreateBanana(){return new ChineseBanana;}virtual AbstractPear* CreatePear(){return new ChinesePear;}
};//美國工廠
class USAFactory:public AbstracFactory{
public:virtual AbstractApple* CreateApple() {return new USAApple;}virtual AbstractBanana* CreateBanana(){return new USABanana;}virtual AbstractPear* CreatePear(){return new USAPear;}
};//日本工廠
class JapaneseFactory:public AbstracFactory{
public:virtual AbstractApple* CreateApple() {return new JapaneseApple;}virtual AbstractBanana* CreateBanana(){return new JapaneseBanana;}virtual AbstractPear* CreatePear(){return new JapanesePear;}
};test(){AbstractFactory* factory = NULL;AbstractApple* apple = NULL;AbstractBanana* banana = NULL:AbstractPear* pear = NULL;//中國工廠factory = new ChineseFactory;  apple = factory->CreateApple();banana = factory->CreateBanana();pear = factory->CreatePear();}

?

總結

一、簡單工廠模式

  我們在實例化對象的時候通常用的式New關鍵字,但是有了工廠,我們在聲明對象的時候就可以用工廠了,用new導致代碼不夠靈活,用工廠來實例化對象很靈活。

  優點,1,簡單工廠包含必要的判斷邏輯,簡單工廠實現了對象的創建和使用的分離。

     2,客戶端無需知道所創建的具體產品類的類名,只需要具體產品類對應的參數即可。

     3,在不修改任何客戶端代碼的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性。

  缺點,1,工廠類的職責過重,簡單工廠中包含邏輯判斷語句,他一旦有問題,整個系統都要出問題。

     2,在添加新類的時候,簡單工廠就要修改,違反了開閉原則。

?

二、工廠方法模式

  工廠方法式簡單工廠的進一步的延申,這樣說是因為簡單工廠違反了開閉原則,而工廠方法可以完美解決這個問題。

  優點,1,工廠方法用來創建類,同時隱藏了具體產品類被實例化的細節,用戶只需要關注工廠,不需要關注創建的細節。

     2,再增加新的運算類時不需要修改代碼,只需要增加對應的工廠即可。符合開閉原則。

  缺點,1,再增加新的類時,也必須增加新的工廠類,會帶來額外的開銷

     2,抽象層的加入使得理解難度加大。

?

三、抽象工廠

  抽象工廠模式是工廠方法的進一步延伸,由于它提供了功能更為強大的工廠類并且具備較好的可擴展性。

  有缺點:抽象工廠模式增加一個產品族很簡單,但是增加一個新的產品就會非常復雜。  

?

轉載于:https://www.cnblogs.com/Maurice-code/p/11608488.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276653.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276653.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276653.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉]Struts 2.1發布

作者 Ian Roughley譯者 崔康 發布于 2009年2月4日 上午8時13分 Struts2框架剛剛發布最新2.1版。該版本做了重大升級&#xff0c;包括重構更多代碼到插件框架、通過增加convention插件減少XML配置和改進REST支持。 我采訪了Musachy Barroso——該版本的一位開發人員&#xff0c…

dim private public static_PHP中const,static,public,private,protected的區別

const: 定義常量&#xff0c;一般定義后不可改變static: 靜態&#xff0c;類名可以訪問public: 表示全局&#xff0c;類內部外部子類都可以訪問&#xff1b;private: 表示私有的&#xff0c;只有本類內部可以使用&#xff1b;protected: 表示受保護的&#xff0c;只有本類或子類…

C#圖解教程 第六章 深入理解類

深入理解類 類成員 前兩章闡述了9種類成員中的兩種&#xff1a;字段和方法。本章將會介紹除事件(第14章)和運算符外的其他類成員&#xff0c;并討論其特征。 成員修飾符的順序 字段和方法的聲明可以包括許多如public、private這樣的修飾符。本章還會討論許多其他修飾符。多個修…

Apache用戶身份驗證

原文鏈接&#xff1a;http://www.yylog.org/?p4830 Apache用戶身份驗證 在apache應用過程中&#xff0c;管理員經常需要對apache下的目錄做一些限制&#xff0c;不希望所有用戶都能訪問該目錄下的文件&#xff0c;只對指定用戶訪問&#xff0c;此時我們就要用到apache用戶身…

攜程elong相繼牽手支付寶轉“危”為“機”

新華網浙江頻道1月16日電 自電子機票全面普及以來&#xff0c;航空公司機票直銷的力度不斷加強正給傳統的機票代理甚至在線旅游平臺帶來了極大的生存壓力。 而面對危機&#xff0c;在進一步豐富自身產品服務之外&#xff0c;大的在線旅行平臺也終于找到對策。繼eLong此前與支付…

c# 獲取word表格中的內容_Java 獲取、刪除Word文本框中的表格

本文介紹如何來獲取Word文本框中包含的表格&#xff0c;以及刪除表格。程序測試環境包括&#xff1a;IDEAJDK 1.8.0Spire.Doc.jar注&#xff1a;jar導入&#xff0c;可通過創建Maven程序項目&#xff0c;并在pom.xml中配置Maven倉庫路徑&#xff0c;并指定Free Spire.Doc for J…

Array.prototype.reduce 的理解與實現

Array.prototype.reduce 是 JavaScript 中比較實用的一個函數&#xff0c;但是很多人都沒有使用過它&#xff0c;因為 reduce 能做的事情其實 forEach 或者 map 函數也能做&#xff0c;而且比 reduce 好理解。但是 reduce 函數還是值得去了解的。 reduce 函數可以對一個數組進行…

PS摳圖方法[photoshop中文教程]

PS摳圖方法 一、魔術棒法——最直觀的方法   適用范圍&#xff1a;圖像和背景色色差明顯&#xff0c;背景色單一&#xff0c;圖像邊界清晰。   方法意圖&#xff1a;通過刪除背景色來獲取圖像。   方法缺陷&#xff1a;對散亂的毛發沒有用。   使用方法&#xff1a…

我的核心技術都是從哪里學到的?如何提高成長的?分享給大家。

1997年&#xff0c;我在讀黑龍江大學讀大二時&#xff0c;我認識了一個內蒙古大學計算機專業畢業的一個高材生&#xff0c;那時我那朋友引導了我很多&#xff0c;他那時候在我們家那邊開一個IT公司&#xff0c;他知道如何靠IT技術賺錢&#xff0c;如何靠程序等賺錢&#xff0c;…

python線性回歸算法簡介_Python實現的簡單線性回歸算法實例分析

本文實例講述了Python實現的簡單線性回歸算法。分享給大家供大家參考&#xff0c;具體如下&#xff1a; 用python實現R的線性模型(lm)中一元線性回歸的簡單方法&#xff0c;使用R的women示例數據&#xff0c;R的運行結果&#xff1a; > summary(fit) Call: lm(formula weig…

Object/Relation Mapping 對象關系映射

對象-關系映射&#xff08;Object/Relation Mapping&#xff0c;簡稱ORM&#xff09;&#xff0c;是隨著面向對象的軟件開發方法發展而產生的。面向對象的開發方法是當今企業級應用開發環境中的主流開發方法&#xff0c;關系數據庫是企業級應用環境中永久存放數據的主流數據存儲…

FastReport使用方法(C/S版)

前言 這兩天群里一直有群友問一些關于FastReport的問題&#xff0c;結合他們的問題&#xff0c;在這里做一個整理&#xff0c;有不明白的可以加 FastReport 交流群 群 號&#xff1a;554714044 工具 VS2017 FastReport 開始 1.新建項目&#xff0c;添加三個按鈕。預覽、設計、…

如何設置Linux時區為東八區

當我們購買美國VPS或服務器的時候&#xff0c;默認情況下是美國時間。對于我們定時執行某些任務會帶來麻煩&#xff0c;所以需要設置時區為東八區。登錄SSH后&#xff0c;執行tzselect命令。我們這里選擇亞洲5.這里選擇china 9。一般選東八區&#xff08;北京&#xff0c;廣東&…

python刪除兩個excel表中的相同元素_python篩選出兩個文件中重復行的方法

查找A文件中&#xff0c;與B文件中內容不重復的內容#!usr/bin/python import sys import os字符串查找函數&#xff0c;使用二分查找法在列表中進行查詢def binarySearch(value, lines): right len(lines) - 1 left 0 a value.strip() while left < right: middle int((…

求解:nhibernate2.0操作oralce提交事務時報錯

代碼如下: Configuration config new Configuration(); config.AddAssembly("TestCleanSnow"); ISessionFactory factory config.BuildSessionFactory(); ISession session f…

python畫楓葉_python-文件的操作

一、異常 程序在運行的過程中&#xff0c;不可避免出現一些錯誤&#xff0c;這些錯誤成為異常 異常以后的代碼都不會被執行 try 語句 代碼塊&#xff08;可能出現錯誤的語句&#xff09; except 異常類型 as 異常名: 代碼塊(出錯以后執行的語句&#xff09; except 異常類型 as…

記2018年技術人一次短暫的創業

背景 2018年8月底&#xff0c;我全職加入了一家創業公司&#xff0c;具體做什么我暫時先不說吧&#xff0c;我是產品和技術負責人&#xff0c;自己出資了50w&#xff0c;大股東&#xff08;下面簡稱T)也就是ceo是早期阿里出身的中供銷售&#xff0c;從2017年11月開始成立此公司…

如何在Apache環境下配置Rewrite規則

原文鏈接&#xff1a;http://faq.comsenz.com/viewnews-12 URL 靜態化是一個利于搜索引擎的設置&#xff0c;通過 URL 靜態化&#xff0c;達到原來是動態的 PHP 頁面轉換為靜態化的 HTML 頁面&#xff0c;當然&#xff0c;這里的靜態化是一種假靜態&#xff0c;目的只是提高搜…

情 人 節 快 樂

我不善于用詞匯修飾我的句子&#xff0c; 我不善于用表情表達我的心情&#xff0c; 我不善于解讀你那黯然的情緒&#xff0c; 我不善于去響應你小小的呼應&#xff0c; 雖然&#xff0c;你了解我&#xff0c; 你寬容于我&#xff0c; 你聽我訴說&#xff0c; 你陪伴著我…

Windows 10系統安裝JDK1.8與配置環境

第一步&#xff1a;下載JDK1.8 地址:https://www.oracle.com/index.html 第二步&#xff1a; 安裝分兩次&#xff0c;第一次是安裝 jdk &#xff0c;第二次是安裝 jre 。安裝jdk默認的安裝地址為C盤&#xff0c;安裝目錄 \java 之前的目錄修改成你想放的目錄&#xff1b;安裝jr…