設計模式(5)--工廠模式

//5.工廠模式
//ver1
//回顧簡單工廠模式
class OperationFactory
{
public:static Operation createOperation(char chOper){Operation * op = NULL;switch(chOper){case '+':op = new OperationAdd();break;case '-':op = new OperationSub();break;default:break;}return *op;}
};void main11()
{Operation oper;oper = OperationFactory::createOperation('+');oper.SetNumberA(1.1);oper.SetNumberB(2.2);double result = oper.GetResult();
}//工廠模式: 
//工廠接口
class Operation
{
public:Operation(){}~Operation(){}
protected:double _NumberA;double _NumberB;
public:void SetNumberA(double A){_NumberA = A;}double GetNumberA(){return _NumberA;}void SetNumberB(double B){_NumberB = B;}double GetNumberB(){return _NumberB;}virtual double GetResult(){double result = 0;return result;}
};class OperationAdd : public Operation
{
public:virtual double GetResult(){double result = _NumberA + _NumberB;return result;}
};class OperationSub : public Operation
{
public:virtual double GetResult(){double result = _NumberA - _NumberB;return result;}
};class IFactory
{
public:virtual Operation CreateOperation(){Operation * po = NULL;return *po;}
};class AddFactory : public IFactory
{
public:virtual Operation CreateOperation(){Operation * po = new OperationAdd();return *po;}
};class SubFactory : public IFactory
{
public:virtual Operation CreateOperation(){Operation * po = new OperationSub();return *po;}
};void main1()
{IFactory * pif = new AddFactory();Operation po = pif->CreateOperation();po.SetNumberA(1.1);po.SetNumberB(2.2);double result = po.GetResult();
}

?

//簡單工廠模式的最大優點在于工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態實例化相關的類,
//對于客戶端來說,去除了與具體產品的依賴。

//工廠模式,定義一個用于創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。
//工廠模式實現時,客戶端需要決定實例化哪一個工廠來實現運算類,選擇判斷的問題還是存在,也就是說,工廠方式把
//簡單工廠的內部邏輯判斷移到了客戶端代碼來進行。你想要加功能,本來是改工廠類,現在是改客戶端。

?

//5.工廠模式
//ver2
class LeiFeng
{
public:void Sweep(){//打掃}void Wash(){//洗衣}
};//學習雷鋒大學生
class Undergraduate : public LeiFeng
{};//志愿者
class Volunteer : public LeiFeng
{};//簡單雷鋒工廠
class SimpleFactory
{
public:static LeiFeng CreateLeiFeng(char cType){LeiFeng * plf = NULL;switch (cType){case '1': //大學生plf = new Undergraduate();break;case '2': //志愿者plf = new Volunteer();break;default:break;}return *plf;}
};void main21()
{LeiFeng stuA = SimpleFactory::CreateLeiFeng('1');stuA.Sweep();LeiFeng volA = SimpleFactory::CreateLeiFeng('2');volA.Wash();
}//雷鋒工廠
class IFactory
{
public://IFactory(){}LeiFeng CreateLeiFeng(){LeiFeng * plf = new LeiFeng();return *plf;}
};//大學生工廠
class UndergraduateFactory : public IFactory
{
public://UndergraduateFactory(){}LeiFeng CreateLeiFeng(){LeiFeng *plf = new Undergraduate();return *plf;}
};//志愿者工廠
class VolunteerFactory : public IFactory
{
public://VolunteerFactory(){}LeiFeng CreateLeiFeng(){LeiFeng * plf = new Volunteer();return *plf;}
};void main22()
{IFactory * pf = new UndergraduateFactory();LeiFeng stu = pf->CreateLeiFeng();stu.Sweep();stu.Wash();
}

?

//工廠模式客服了簡單工廠違背開放-封閉原則的缺點,又保持了封裝對象創建過程的優點。
//缺點:每加一個產品,就需要加一個產品工廠的類,增加了額外的開發量。

 

?

轉載于:https://www.cnblogs.com/sylar-liang/p/6025042.html

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

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

相關文章

對于多屬性類型系統的數據庫設計

主要是以下幾類系統: 生活信息系統, 內容:小, 屬性:大,電商商品系統, 內容:大, 屬性:大,風控征信系統, 內容:小, 屬性:大,新聞系統, 內容:大, 屬性:小,這些系統共同的特點, 都是在主體內容上會攜帶多個屬性, 并且屬性需要隨時能調整, 并且要求能兼容舊屬性, 還需要頻繁的通過屬…

linux環境部署常用命令

1.  查看當前所屬目錄:pwd2.  回到上級目錄:cd ../回到上兩級目錄:cd ../ ../3.  查看當前目錄下有哪些文件:ls4.  查看最后100行日志:tail -100 catalina.out動態重看操作日志:tail -f catalina.o…

DM6446開發攻略:V4L2視頻驅動和應用分析

針對DAVINCI DM6446平臺,網絡上也有很多網友寫了V4L2的驅動,但只是解析Montavistalinux-2.6.10 V4L2的原理、結構和函數,深度不夠。本文決定把Montavista 的Linux-2.6.18 V4L2好好分析一下,順便講解在產品中的應用,滿足…

相機像素尺寸(像元大小)和成像系統分辨率之間的關系

相機像素尺寸(像元大小)和成像系統分辨率之間的關系 在顯微成像系統中,常常會用分辨率來評價其成像能力的好壞。這里的分辨率通常是指光學系統的極限分辨率以及成像探測器的圖像分辨率。最終圖像所呈現出的實際分辨率,取決于二者的…

H5網頁播放器播不了服務器上的mp4視頻文件

打開IIS,在功能視圖里找到MIME類型菜單,打開該菜單后鼠標右鍵添加.mp4擴展名的MIME類型video/mp4 其他視頻文件播放不了估計也得在IIS里添加對應的MIME類型(從服務器下載文件時也得添加對應的MIME類型) 轉載于:https://www.cnblog…

不定寬度居中

一、傳統方法 <div class"wrap"><div class"inner">html &#xff1a; 讓 inner 居中</div> </div> .wrap {float: left; /* 自適應內容寬度 */position: relative;left: 50%; } .inner {position: relative;left: -50%; } 二、…

文章目錄自動生成器

提供一個插件&#xff0c;可以實現segmentfault的文章目錄效果啦~~ 不止點擊跳轉還滾動激活當前鏈接 demo地址 使用很簡單 <!-- 文章容器 --> <div id"kCatelog"></div> <!-- 目錄容器 --> <div class"k-catelog-list" id"…

基于ARM+DSP進行應用開發-經驗共享

針對當前應用的復雜性&#xff0c;SOC芯片更好能能滿足應用和媒體的需求&#xff0c;集成眾多接口&#xff0c;用ARM做為應用處理器進行多樣化的應用開發和用戶界面和接口&#xff0c;利用DSP進行算法加速&#xff0c;特別是媒體的編解碼算法加速&#xff0c;既能夠保持算法的靈…

工業相機之全局曝光與卷簾曝光

曝光方式包括兩種&#xff1a; 全局曝光&#xff08;global shutter&#xff09;卷簾曝光&#xff08;rolling shutter&#xff09; CCD相機都是全局曝光&#xff0c;CMOS相機既有全局曝光也有卷簾曝光 全局曝光 全局曝光的方式比較簡單。也就是說光圈打開后&#xff0c;整個圖…

Hibernate入門注解筆記

Entity 代表實體 映射一張表 Table 定義表的屬性 Embeddable 定義類級別可以被嵌入 Id 指定主鍵 GeneratedValue 指定主鍵生成策略 Column指定列級別的屬性 Embedded 指定屬性為被包含類 將被包含類 作為 包含類的 字段屬性 寫入同一張表 EmbeddedId 指定包含類為特定主鍵 實…

.NET 環境中使用RabbitMQ

在企業應用系統領域&#xff0c;會面對不同系統之間的通信、集成與整合&#xff0c;尤其當面臨異構系統時&#xff0c;這種分布式的調用與通信變得越發重要。其次&#xff0c;系統中一般會有很多對實時性要求不高的但是執行起來比較較耗時的地方&#xff0c;比如發送短信&#…

css3 pointer-events:none 允許點擊穿透

開發時加了蒙層&#xff0c;卻可以點擊到蒙層下邊的元素。查了以后才發現是 pointer-events:none屬性具有允許點擊穿透的功能&#xff0c;將其設為 pointer-events:auto就好使了。事件穿透讓我想起了zepto.js中的tap事件同樣會引發事件穿透的效果。如果用tap事件是為了提升響應…

成像質量、像素個數、感光元件尺寸的關系

成像質量、像素個數、感光元件尺寸的關系 感光元件 (影像傳感器) 就是拍攝的照片最終成像的位置。相當于傳統相機里面的膠卷&#xff0c;不同相機的感光元件尺寸是不一樣的。 1. 像素的含義 兩個 100 平方米的房子 A 和 B&#xff0c;A 房子里面平均分成 10 個房間&#xff…

setjmp與logjmp用法總結

setjmp/logjmp的最大用途是錯誤恢復&#xff0c;只要還沒有從主函數退出&#xff0c;一旦發現一個不可恢復的錯誤&#xff0c;可以把主控制轉移大主函數循環&#xff0c;并從那從新開始。使用時必須包含頭文件<setjmp.h> setjmp與longjmp結合使用時&#xff0c;它們必須…

JQ對象到底是什么

jQuery對象是什么&#xff0c;舉個例子&#xff0c;$(#id) 返回的就是jQuery對象&#xff0c;這個東西是整個jQuery的核心所在&#xff0c;所以我先來分析它。 var jQuery function( selector, context ) { // The jQuery object is actually just the init constructor enhan…

15、iOS開發之duplicate symbols for architecture x86_64錯誤

1. 錯誤提示 2. 分析錯誤原因 3. 解決問題辦法 一、錯誤提示 在我們寫代碼過程中可能會經常遇到這樣一個錯誤&#xff1a; [objc] view plaincopy print?<span style"font-size:32px;color:#ff0000;">ld: 4 duplicate symbols for architecture x86_64 clang…

【死磕Java并發】----- 死磕 Java 并發精品合集

【死磕 Java 并發】系列是 LZ 在 2017 年寫的第一個死磕系列&#xff0c;一直沒有做一個合集&#xff0c;這篇博客則是將整個系列做一個概覽。 先來一個總覽圖&#xff1a; 【高清圖&#xff0c;請關注“Java技術驛站”公眾號&#xff0c;回復&#xff1a;腦圖JUC】 【死磕Java…

vs官方使用教程中文版與英文版

Visual Studio IDE 中文文檔 https://docs.microsoft.com/zh-cn/visualstudio/ide/ Visual Studio IDE documentation https://docs.microsoft.com/en-us/visualstudio/ide/

linux subsys_initcall

宏定義__define_initcall(level,fn)對于內核的初始化很重要&#xff0c;他指示編譯器在編譯的時候&#xff0c;將一系列初始化函數的起始地址值按照一定的順序放在一個section中。在內核初始化段&#xff0c;do_initcalls() 將按順序從該section中以函數指針的形式取出這些函數…

vue transition

Vue.js 教程 (9) : 過渡動畫 Vue.js 提供非常簡單的過渡動畫接口。這些過渡動畫在 Vue.js 將目標元素插入或移除出 DOM 的時候會自動執行。能夠觸發動畫的指令包括 v-if , v-show 和 v-repeat。同時&#xff0c;vm 實例的 $appendTo() , $before() , $after() 和 $remove() 方法…