C語(yǔ)言 | 簡(jiǎn)單工廠方法模式實(shí)現(xiàn)例子
來(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)贊、在看。
