<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          C語(yǔ)言 | 簡(jiǎn)單工廠方法模式實(shí)現(xiàn)例子

          共 5198字,需瀏覽 11分鐘

           ·

          2022-05-15 12:12

          ????關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容

          來(lái)源:https://blog.csdn.net/weixin_46826913/article/details/106289647


          1、簡(jiǎn)介

          簡(jiǎn)單工廠方法定義一個(gè)用于創(chuàng)建對(duì)象的類(lèi),該類(lèi)接受一個(gè)參數(shù),通過(guò)參數(shù)決定創(chuàng)建不同的對(duì)象。

          GOF并沒(méi)有把簡(jiǎn)單工廠方法定義為23種設(shè)計(jì)模式之一,可以認(rèn)為簡(jiǎn)單工廠方法是工廠方法的簡(jiǎn)化形式。

          為了體現(xiàn)簡(jiǎn)單工廠方法和工廠方法的區(qū)別和聯(lián)系,此處把簡(jiǎn)單工廠方法先單獨(dú)講一下。

          2、模擬場(chǎng)景

          假設(shè)你要生產(chǎn)電腦,電腦由硬盤(pán)、內(nèi)存條、CPU、主板的部件組成。你為了保證供應(yīng)鏈可靠,每種部件都選擇了至少兩家供應(yīng)商。比如:

          硬盤(pán)供應(yīng)商 seagate、Toshiba

          內(nèi)存條供應(yīng)商 SAMSUNG、Crucial

          CPU供應(yīng)商 intel、AMD

          主板供應(yīng)商 intel、AMD

          此處列出多個(gè)部件是為了后面講解工廠方法、抽象工廠方法時(shí)使用同一個(gè)模擬場(chǎng)景。本章講簡(jiǎn)單工廠方法暫時(shí)不需要涉及這么多部件,所以?xún)H以硬盤(pán)這一個(gè)部件為例進(jìn)行講解。

          3、實(shí)現(xiàn)的思路

          硬盤(pán)就是要?jiǎng)?chuàng)建的對(duì)象(即:產(chǎn)品)。為了讓不同供應(yīng)商提供的硬盤(pán)可以通用,要定義一個(gè)硬盤(pán)產(chǎn)品類(lèi),并讓不同供應(yīng)商的硬盤(pán)都繼承硬盤(pán)產(chǎn)品類(lèi)的接口。

          還需要定義一個(gè)創(chuàng)建硬盤(pán)對(duì)象的類(lèi)(即:工廠)。工廠類(lèi)根據(jù)參數(shù)決定創(chuàng)建哪家供應(yīng)商的硬盤(pán)對(duì)象。

          4、實(shí)現(xiàn)硬盤(pán)對(duì)象創(chuàng)建

          參與者:

          (1)Product: HardDisk 定義硬盤(pán)對(duì)象的接口

          (2)Concrete Product: SeagateHardDisk, ToshibaHardDisk 實(shí)現(xiàn)不同供應(yīng)商的硬盤(pán)

          (3)SimpleFactory: HardDiskFactory 根據(jù)參數(shù),創(chuàng)建不同供應(yīng)商的硬盤(pán)對(duì)象

          UML:

          HardDisk代碼示例:

          hard_disk.h:

          #ifndef?HARD_DISK_H
          #define?HARD_DISK_H

          struct?HardDisk?{
          ????void?(*Operation)(struct?HardDisk?*this);
          };

          #endif

          SeagateHardDisk代碼示例:

          seagate_hard_disk.h:

          #ifndef?SEAGATE_HARD_DISK_H
          #define?SEAGATE_HARD_DISK_H

          #include?"hard_disk.h"

          struct?SeagateHardDisk?{
          ????struct?HardDisk?hardDisk;
          };

          //?構(gòu)造函數(shù)
          void?SeagateHardDisk(struct?SeagateHardDisk?*this);

          //?析構(gòu)函數(shù)
          void?_SeagateHardDisk(struct?SeagateHardDisk?*this);

          #endif

          seagate_hard_disk.c:

          #include?"seagate_hard_disk.h"
          #include?"stdio.h"

          void?SeagateOperation(struct?SeagateHardDisk?*this)
          {
          ????printf("這是?Seagate?硬盤(pán)\n");
          }

          void?SeagateHardDisk(struct?SeagateHardDisk?*this)
          {
          ????this->hardDisk.Operation?=?(void(*)(struct?HardDisk?*))SeagateOperation;
          }

          void?_SeagateHardDisk(struct?SeagateHardDisk?*this)
          {
          ????this->hardDisk.Operation?=?NULL;
          }

          ToshibaHardDisk代碼示例:

          toshiba_hard_disk.h:

          #ifndef?TOSHIBA_HARD_DISK_H
          #define?TOSHIBA_HARD_DISK_H

          #include?"hard_disk.h"

          struct?ToshibaHardDisk?{
          ????struct?HardDisk?hardDisk;
          };

          //?構(gòu)造函數(shù)
          void?ToshibaHardDisk(struct?ToshibaHardDisk?*this);

          //?析構(gòu)函數(shù)
          void?_ToshibaHardDisk(struct?ToshibaHardDisk?*this);

          #endif

          toshiba_hard_disk.c:

          #include?"toshiba_hard_disk.h"
          #include?"stdio.h"

          void?ToshibaOperation(struct?ToshibaHardDisk?*this)
          {
          ????printf("這是?Toshiba?硬盤(pán)\n");
          }

          void?ToshibaHardDisk(struct?ToshibaHardDisk?*this)
          {
          ????this->hardDisk.Operation?=?(void(*)(struct?HardDisk?*))ToshibaOperation;
          }

          void?_ToshibaHardDisk(struct?ToshibaHardDisk?*this)
          {
          ????this->hardDisk.Operation?=?NULL;
          }

          HardDiskFactory代碼示例:

          hard_disk_factory.h:

          #ifndef?HARD_DISK_FACTORY_H
          #define?HARD_DISK_FACTORY_H

          #include?"hard_disk.h"

          enum?HARD_DISK_SUPPLIER_E?{
          ????HARD_DISK_SUPPLIER_SEAGATE,
          ????HARD_DISK_SUPPLIER_TOSHIBA
          };

          struct?HardDiskFactory?{
          ????struct?HardDisk*?(*Create)(struct?HardDiskFactory?*this,?
          ???????????????????????????????enum?HARD_DISK_SUPPLIER_E?supplier);

          ????void?(*Destroy)(struct?HardDiskFactory?*this,?
          ????????????????????struct?HardDisk*?hardDisk);
          };

          //?構(gòu)造函數(shù)
          void?HardDiskFactory(struct?HardDiskFactory?*this);

          //?析構(gòu)函數(shù)
          void?_HardDiskFactory(struct?HardDiskFactory?*this);

          #endif

          hard_disk_factory.c:

          #include?"hard_disk_factory.h"
          #include?"seagate_hard_disk.h"
          #include?"toshiba_hard_disk.h"
          #include?"stdio.h"
          #include?"stdlib.h"

          struct?HardDisk?*Create(struct?HardDiskFactory?*this,?
          ????????????????????????enum?HARD_DISK_SUPPLIER_E?supplier)
          ?
          {
          ????switch?(supplier)?{
          ????????case?HARD_DISK_SUPPLIER_SEAGATE:
          ????????{
          ????????????struct?SeagateHardDisk?*seagateHardDisk?=?NULL;
          ????????????if?((seagateHardDisk?=?malloc(sizeof(struct?SeagateHardDisk)))?==?NULL)?{
          ????????????????printf("fail?in?malloc\n");
          ????????????????return?NULL;
          ????????????}
          ????????????SeagateHardDisk(seagateHardDisk);
          ????????????return?(struct?HardDisk?*)seagateHardDisk;
          ????????}
          ????????case?HARD_DISK_SUPPLIER_TOSHIBA:
          ????????{
          ????????????struct?ToshibaHardDisk?*toshibaHardDisk?=?NULL;
          ????????????if?((toshibaHardDisk?=?malloc(sizeof(struct?ToshibaHardDisk)))?==?NULL)?{
          ????????????????printf("fail?in?malloc\n");
          ????????????????return?NULL;
          ????????????}
          ????????????ToshibaHardDisk(toshibaHardDisk);
          ????????????return?(struct?HardDisk?*)toshibaHardDisk;
          ????????}
          ????????default:
          ????????????printf("未知的供應(yīng)商\n");
          ????????????return?NULL;
          ????}
          }

          void?Destroy(struct?HardDiskFactory?*this,?struct?HardDisk*?hardDisk)
          {
          ????if?(hardDisk?!=?NULL)?{
          ????????free(hardDisk);
          ????}
          }

          //?構(gòu)造函數(shù)
          void?HardDiskFactory(struct?HardDiskFactory?*this)
          {
          ????this->Create?=?Create;
          ????this->Destroy?=?Destroy;
          }

          //?析構(gòu)函數(shù)
          void?_HardDiskFactory(struct?HardDiskFactory?*this)
          {
          ????this->Create?=?NULL;
          ????this->Destroy?=?NULL;
          }

          客戶(hù)端代碼示例:

          #include?"hard_disk.h"
          #include?"hard_disk_factory.h"
          #include?"stddef.h"

          void?main()
          {
          ????struct?HardDisk?*hardDisk?=?NULL;

          ????struct?HardDiskFactory?hardDiskFactory;
          ????HardDiskFactory(&hardDiskFactory);
          ????
          ????//?創(chuàng)建?seagate?硬盤(pán)對(duì)象
          ????hardDisk?=?hardDiskFactory.Create(&hardDiskFactory,?HARD_DISK_SUPPLIER_SEAGATE);
          ????//?使用?seagate?硬盤(pán)對(duì)象
          ????hardDisk->Operation(hardDisk);??
          ????//?銷(xiāo)毀?seagate?硬盤(pán)對(duì)象
          ????hardDiskFactory.Destroy(&hardDiskFactory,?hardDisk);???????
          ????
          ????//?創(chuàng)建?toshiba?硬盤(pán)對(duì)象
          ????hardDisk?=?hardDiskFactory.Create(&hardDiskFactory,?HARD_DISK_SUPPLIER_TOSHIBA);
          ????//?使用?seagate?硬盤(pán)對(duì)象
          ????hardDisk->Operation(hardDisk);
          ????//?銷(xiāo)毀?toshiba?硬盤(pán)對(duì)象
          ????hardDiskFactory.Destroy(&hardDiskFactory,?hardDisk);????
          ????
          ????_HardDiskFactory(&hardDiskFactory);
          }

          客戶(hù)端顯示示例:

          ./hard_disk
          這是?Seagate?硬盤(pán)
          這是?Toshiba?硬盤(pán)

          版權(quán)聲明:本文來(lái)源網(wǎng)絡(luò),免費(fèi)傳達(dá)知識(shí),版權(quán)歸原作者所有。如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系我進(jìn)行刪除。

          ???????????????? ?END ????????????????

          關(guān)注我的微信公眾號(hào),回復(fù)“加群”按規(guī)則加入技術(shù)交流群。


          點(diǎn)擊“閱讀原文”查看更多分享,歡迎點(diǎn)分享、收藏、點(diǎn)贊、在看。

          瀏覽 105
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色爱无码| 欧美h网站| 丁香激情五月天 | 在线无.码 | 亚洲最大S8SP |