設計模式學習——工廠模式(Factory Pattern)

来源:http://www.cnblogs.com/chinxi/archive/2017/08/12/7351508.html
-Advertisement-
Play Games

1、有一個工廠,專門生產不同品牌的汽車。當有人需要從此工廠提貨的時候,只需要告訴他,要什麼品牌的,就可以了,並不關心這些車是怎麼生產出來的。 2、以上方式,如果增加品牌的時候,也要修改工廠,有點麻煩。於是,把工廠也抽象了。 1的類圖與實現: 首先,是通用的車 然後是不同品牌的車,繼承自Car 接著, ...


1、有一個工廠,專門生產不同品牌的汽車。當有人需要從此工廠提貨的時候,只需要告訴他,要什麼品牌的,就可以了,並不關心這些車是怎麼生產出來的。

2、以上方式,如果增加品牌的時候,也要修改工廠,有點麻煩。於是,把工廠也抽象了。

 

1的類圖與實現:

 

 首先,是通用的車

 1  ///
 2  /// @file    Car.h
 3  /// @author  marrs([email protected])
 4  /// @date    2017-08-12 20:10:31
 5  ///
 6 
 7 #ifndef __CAR_H__
 8 #define __CAR_H__
 9 
10 #include <iostream>
11  
12 namespace marrs{
13  
14 using std::cout;
15 using std::cerr;
16 using std::endl;
17 
18 class Car
19 {
20     public:
21         Car() : b_IsRunning(0){}
22         virtual ~Car(){};
23     public:
24         virtual void Run() = 0;
25         virtual void Stop() = 0;
26     protected:
27         bool b_IsRunning;
28 };
29 
30 }
31 
32 #endif //__CAR_H__

 

 然後是不同品牌的車,繼承自Car

 1  ///
 2  /// @file    Benz.h
 3  /// @author  marrs([email protected])
 4  /// @date    2017-08-12 20:20:54
 5  ///
 6 
 7 #ifndef __BENZ_H__
 8 #define __BENZ_H__
 9 
10 #include "Car.h"
11 
12 namespace marrs{
13 
14 class Benz
15 : public Car
16 {
17     public:
18         ~Benz(){}
19     public:
20         void Run();
21         void Stop();
22 };
23  
24 }
25 
26 #endif //__BENZ_H__
 1  ///
 2  /// @file    Benz.cc
 3  /// @author  marrs([email protected])
 4  /// @date    2017-08-12 20:21:54
 5  ///
 6 
 7 #include "Benz.h"
 8 
 9 namespace marrs{
10 
11 void Benz::Run()
12 {
13     if (b_IsRunning)
14     {
15         cerr << "Benz is running!" << endl;
16     }
17 
18     cout << "Benz is going to running!" << endl;
19     b_IsRunning = true;
20 }
21 
22 void Benz::Stop()
23 {
24     if (!b_IsRunning)
25     {
26         cerr << "Benz isn't running..." << endl;
27     }
28 
29     cout << "Benz is going to stopping!" << endl;
30     b_IsRunning = false;
31 }
32  
33 }

 

 

 1  ///
 2  /// @file    Audi.h
 3  /// @author  marrs([email protected])
 4  /// @date    2017-08-12 20:20:54
 5  ///
 6 
 7 #ifndef __AUDI_H__
 8 #define __AUDI_H__
 9 
10 #include "Car.h"
11 
12 namespace marrs{
13 
14 class Audi
15 : public Car
16 {
17     public:
18         ~Audi(){}
19     public:
20         void Run();
21         void Stop();
22 };
23  
24 }
25 
26 #endif//__AUDI_H__
 1  ///
 2  /// @file    Audi.cc
 3  /// @author  marrs([email protected])
 4  /// @date    2017-08-12 20:21:54
 5  ///
 6 
 7 #include "Audi.h"
 8 
 9 namespace marrs{
10 
11 void Audi::Run()
12 {
13     if (b_IsRunning)
14     {
15         cerr << "Audi is running!" << endl;
16     }
17 
18     cout << "Audi is going to running!" << endl;
19     b_IsRunning = true;
20 }
21 
22 void Audi::Stop()
23 {
24     if (!b_IsRunning)
25     {
26         cerr << "Audi isn't running..." << endl;
27     }
28 
29     cout << "Audi is going to stopping!" << endl;
30     b_IsRunning = false;
31 }
32  
33 }

 

 

 

 1  ///
 2  /// @file    Lamborghini.h
 3  /// @author  marrs([email protected])
 4  /// @date    2017-08-12 20:20:54
 5  ///
 6 
 7 #ifndef __LAMBORGHINI_H__
 8 #define __LAMBORGHINI_H__
 9 
10 #include "Car.h"
11 
12 namespace marrs{
13 
14 class Lamborghini
15 : public Car
16 {
17     public:
18         ~Lamborghini(){}
19     public:
20         void Run();
21         void Stop();
22 };
23  
24 }
25 
26 #endif//__LAMBORGHINI_H__
 1  ///
 2  /// @file    Lamborghini.cc
 3  /// @author  marrs([email protected])
 4  /// @date    2017-08-12 20:21:54
 5  ///
 6 
 7 #include "Lamborghini.h"
 8 
 9 namespace marrs{
10 
11 void Lamborghini::Run()
12 {
13     if (b_IsRunning)
14     {
15         cerr << "Lamborghini is running!" << endl;
16     }
17 
18     cout << "Lamborghini is going to running!" << endl;
19     b_IsRunning = true;
20 }
21 
22 void Lamborghini::Stop()
23 {
24     if (!b_IsRunning)
25     {
26         cerr << "Lamborghini isn't running..." << endl;
27     }
28 
29     cout << "Lamborghini is going to stopping!" << endl;
30     b_IsRunning = false;
31 }
32  
33 }

 

 接著,有個生產工廠

 1  ///
 2  /// @file    Factory.h
 3  /// @author  marrs([email protected])
 4  /// @date    2017-08-12 20:27:42
 5  ///
 6 
 7 #ifndef __FACTORY_H__
 8 #define __FACTORY_H__
 9 
10 
11 #include "Benz.h"
12 #include "Audi.h"
13 #include "Lamborghini.h"
14 
15 
16 enum Brand
17 {
18     EN_BRAND_CAR_BANZ = 0,
19     EN_BRAND_CAR_AUDI,
20     EN_BRAND_CAR_LAMBORGHINI,
21 };
22 
23 
24 namespace marrs{
25  
26 using std::cout;
27 using std::endl;
28 
29 class Factory
30 {
31 public:
32     Car * Produce(int int_brand);
33     void Reclaim(Car * car_brand);
34 };
35  
36 }
37 
38 
39 #endif //__FACTORY_H__
 1  ///
 2  /// @file    Factory.cc
 3  /// @author  marrs([email protected])
 4  /// @date    2017-08-12 20:39:05
 5  ///
 6  
 7 #include "Factory.h" 
 8 
 9 namespace marrs{
10 
11 Car * Factory::Produce(int int_brand)
12 {
13     switch(int_brand)
14     {
15         case EN_BRAND_CAR_BANZ:
16             return new Benz;
17         case EN_BRAND_CAR_AUDI:
18             return new Audi;
19         case EN_BRAND_CAR_LAMBORGHINI:
20             return new Lamborghini;    
21         default:break;
22     }
23     return NULL;
24 }
25 
26 void Factory::Reclaim(Car * car_brand)
27 {
28     delete car_brand;
29 }
30  
31 }

為了方便統一處理方式,我把車的銷毀也放到工廠類里了。

 

 1  ///
 2  /// @file    main.cc
 3  /// @author  marrs([email protected])
 4  /// @date    2017-08-12 20:40:59
 5  ///
 6  
 7 #include "Factory.h"
 8 
 9 using namespace marrs;
10 
11 int main()
12 {
13     Factory factory;
14     
15     Car * car_first = factory.Produce(EN_BRAND_CAR_BANZ); 
16     car_first->Run();
17     car_first->Stop();
18     factory.Reclaim(car_first);
19 
20     Car * car_second = factory.Produce(EN_BRAND_CAR_AUDI); 
21     car_second->Run();
22     car_second->Stop();
23     factory.Reclaim(car_second);
24 
25     Car * car_third = factory.Produce(EN_BRAND_CAR_LAMBORGHINI); 
26     car_third->Run();
27     car_third->Stop();
28     factory.Reclaim(car_third);
29 
30 }

 

編譯,運行

[ccx@ubuntu ~/object-oriented/Factory-Pattern]$>g++ * -o car_factory.exe
[ccx@ubuntu ~/object-oriented/Factory-Pattern]$>./car_factory.exe 
Benz is going to running!
Benz is going to stopping!
Audi is going to running!
Audi is going to stopping!
Lamborghini is going to running!
Lamborghini is going to stopping!

 

 

2的類圖與實現 (畫圖功底不行....略亂)

 

在1的基礎之上,修改Factory

 1  ///
 2  /// @file    Factory.h
 3  /// @author  marrs([email protected])
 4  /// @date    2017-08-12 20:27:42
 5  ///
 6 
 7 #ifndef __FACTORY_H__
 8 #define __FACTORY_H__
 9 
10 
11 #include "Car.h"
12 
13 namespace marrs{
14  
15 using std::cout;
16 using std::endl;
17 
18 class Factory
19 {
20     public:
21         virtual ~Factory(){}
22     public:
23         virtual Car * Produce() = 0;
24         void Reclaim(Car * car_brand)
25         {
26             delete car_brand;
27         }
28 };
29 
30 }
31 
32 
33 #endif //__FACTORY_H__

 

 

然後是不同的工廠

 1  ///
 2  /// @file    Benz_Factory.h
 3  /// @author  marrs([email protected])
 4  /// @date    2017-08-12 21:21:58
 5  ///
 6 
 7 #ifndef __BENZ_FACTORY_H__
 8 #define __BENZ_FACTORY_H__
 9 
10 #include "Factory.h"
11 #include "Benz.h"
12 
13 namespace marrs{
14 
15 class BenzFactory
16 : public Factory
17 {
18     public:
19         Car * Produce()
20         {
21             return new Benz;
22         }
23 };
24 
25 }
26 
27 #endif // __BENZ_FACTORY_H__
 1  ///
 2  /// @file    Audi_Factory.h
 3  /// @author  marrs([email protected])
 4  /// @date    2017-08-12 21:21:58
 5  ///
 6 
 7 #ifndef __AUDI_FACTORY_H__
 8 #define __AUDI_FACTORY_H__
 9 
10 #include "Factory.h"
11 #include "Audi.h"
12 
13 namespace marrs{
14 
15 class AudiFactory
16 : public Factory
17 {
18     public:
19         Car * Produce()
20         {
21             return new Audi;
22         }
23 };
24 
25 }
26 
27 #endif // __AUDI_FACTORY_H__
 1  ///
 2  /// @file    Lamborghini_Factory.h
 3  /// @author  marrs([email protected])
 4  /// @date    2017-08-12 21:21:58
 5  ///
 6 
 7 #ifndef __LAMBORGHINI_FACTORY_H__
 8 #define __LAMBORGHINI_FACTORY_H__
 9 
10 #include "Factory.h"
11 #include "Lamborghini.h"
12 
13 namespace marrs{
14 
15 class LamborghiniFactory
16 : public Factory
17 {
18     public:
19         Car * Produce()
20         {
21             return new Lamborghini;
22         }
23 };
24 
25 }
26 
27 #endif // __LAMBORGHINI_FACTORY_H__

 

 

最後修改main.cc

 1  ///
 2  /// @file    main.cc
 3  /// @author  marrs([email protected])
 4  /// @date    2017-08-12 20:40:59
 5  ///
 6  
 7 #include "Benz_Factory.h"
 8 #include "Audi_Factory.h"
 9 #include "Lamborghini_Factory.h"
10 
11 using namespace marrs;
12 
13 void BenzAction()
14 {
15     Factory * factory = new BenzFactory;
16     Car * car_first = factory->Produce(); 
17     car_first->Run();
18     car_first->Stop();
19     factory->Reclaim(car_first);
20     delete factory;
21 }
22 
23 void AudiAction()
24 {
25     Factory * factory = new AudiFactory;
26     Car * car_first = factory->Produce(); 
27     car_first->Run();
28     car_first->Stop();
29     factory->Reclaim(car_first);
30     delete factory;
31 }
32 
33 void LamborghiniAction()
34 {
35     Factory * factory = new LamborghiniFactory;
36     Car * car_first = factory->Produce(); 
37     car_first->Run();
38     car_first->Stop();
39     factory->Reclaim(car_first);
40     delete factory;
41 }
42 
43 
44 int main()
45 {
46     BenzAction();
47     AudiAction();
48     LamborghiniAction();
49 
50     return 0;
51 }

 

 

編譯,運行

[ccx@ubuntu ~/object-oriented/Factory-Pattern_2]$>g++ * -o car_Factory.exe
[ccx@ubuntu ~/object-oriented/Factory-Pattern_2]$>./car_Factory.exe 
Benz is going to running!
Benz is going to stopping!
Audi is going to running!
Audi is going to stopping!
Lamborghini is going to running!
Lamborghini is going to stopping!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上一篇我們介紹了JVM的基本運行流程以及記憶體結構,對JVM有了初步的認識,這篇文章我們將根據JVM的記憶體模型探索java當中變數的可見性以及不同的java指令在併發時可能發生的指令重排序的情況。 記憶體模型 首先我們思考一下一個java線程要向另外一個線程進行通信,應該怎麼做,我們再把需求明確一點,一 ...
  • 目錄 · 初步認識 · Java里程碑(關鍵部分) · 理解虛擬機 · Java虛擬機種類 · Java語言規範 · Java虛擬機規範 · 基本結構 · Java堆(Heap) · Java棧(Stacks) · 方法區(Method Area) · 直接記憶體(Direct Memory) · 本 ...
  • 類與Class對象 類是程式的一部分,每個類都有一個Class對象,即每當編寫並且編譯一個新類的時候就會產生一個Class對象。當程式創建第一個對類的靜態成員的引用的時候,會將該類動態載入到JVM中,這個說明瞭類的構造起器也是一個靜態方法,即使在構造器之前並沒有使用static關鍵字。所以java程 ...
  • 前段時間應因緣梳理了下自己的 Java 知識體系, 成文一篇望能幫到即將走進或正在 Java 世界跋涉的程式員們。 第一張,基礎圖 大約在 2003 年我開始知道 Java 的(當時還在用 Delphi),但到 2004 年本科畢業才開始正式決定學習 Java。 那時覺得用 Delphi 寫 C/S ...
  • 從大型網站技術架構_核心原理與案例分析 李智慧 一書中領悟到的東西。我們的技術只有基礎牢固了才能創新,本書中作者講述了網站架構的發展歷程。其中從最簡單的 LAMP架構到應用與數據分離,然後是使用緩存提高客戶體驗度。再到分層,資料庫的讀取分離,集群,分散式部署等。處理網站高併發的問題肯定會牽扯到高併發 ...
  • 放假啦~學生們要買車票回家了,有汽車票、火車票,等。但是,車站很遠,又要考試,怎麼辦呢?找代理買啊,雖然要多花點錢,但是,說不定在搞活動,有折扣呢~ 編譯,運行 ...
  • 本周要進行boost asio庫的學習,在學習之前發現最好需要先瞭解一下前攝器模式,這樣對asio庫的理解很有幫助,故寫下此文 我之前寫的隨筆XShell的模擬實現中的鏈接方式可以說是同步的(伺服器阻塞等待鏈接),這樣當有伺服器端在等待鏈接的時候就浪費了大量的資源,我們可以讓伺服器非同步等待客戶端的鏈 ...
  • 現有一批裝備(產品),分為不同的部位(上裝、下裝)與不同的等級(lv1、lv2)。又有不同lv的工廠,只生產對應lv的全套裝備。 代碼實現上...本次寫得比較偷懶,函數實現都寫在頭文件了.... 有些重覆的代碼,是直接用sed替換一些字元生成的。如: Suit Trousers Clothes Tr ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...