学习笔记——工厂模式Factory

Product是我们所需要获得的对象,一般的使用中,我们直接通过new获得新对象。

当需要大量获得对象时,每一次都new会很麻烦。

《真菌世界》游戏中,一个星球上有很多树,一棵树会不断生成真菌。星球是场景,树就是工厂,真菌就是产品。场景不用关心如何生成一种特定类型的真菌,真菌的属性由生产它的工厂负责就行了。

简单代码示例:

C++示例

BaseFungus.h

复制代码
1 #pragma once
2 class CBaseFungus
3 {
4 public:
5     CBaseFungus(void);
6     ~CBaseFungus(void);
7 public:
8     virtual void Fight();
9 };
复制代码

BaseFungus.cpp

复制代码
 1 #include "BaseFungus.h"
 2 #include <iostream>
 3 
 4 
 5 CBaseFungus::CBaseFungus(void)
 6 {
 7 }
 8 
 9 
10 CBaseFungus::~CBaseFungus(void)
11 {
12 }
13 
14 void CBaseFungus::Fight()
15 {
16     std::cout<<"Base fungus fight"<<std::endl;
17 }
复制代码

Fungus.h

复制代码
 1 #pragma once
 2 #include "basefungus.h"
 3 class CFungus :
 4     public CBaseFungus
 5 {
 6 public:
 7     CFungus(void);
 8     ~CFungus(void);
 9 public:
10     void Fight();
11 };
复制代码

Fungus.cpp

复制代码
 1 #include "Fungus.h"
 2 #include <iostream>
 3 
 4 
 5 CFungus::CFungus(void)
 6 {
 7 }
 8 
 9 
10 CFungus::~CFungus(void)
11 {
12 }
13 
14 void CFungus::Fight()
15 {
16     std::cout<<"Fungus fight"<<std::endl;
17 }
复制代码

Tree.h

复制代码
 1 #pragma once
 2 #include "BaseFungus.h"
 3 
 4 class CTree
 5 {
 6 public:
 7     CTree(void);
 8     ~CTree(void);
 9 public:
10     CBaseFungus* GetFungus();
11 };
复制代码

Tree.cpp

复制代码
 1 #include "Tree.h"
 2 #include "Fungus.h"
 3 
 4 
 5 CTree::CTree(void)
 6 {
 7 }
 8 
 9 
10 CTree::~CTree(void)
11 {
12 }
13 
14 CBaseFungus* CTree::GetFungus()
15 {
16     return new CFungus();
17 }
复制代码

main.cpp

复制代码
 1 #include <iostream>
 2 #include "Tree.h"
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     CTree* pTree = new CTree();
 8     CBaseFungus* pFungus = pTree->GetFungus();
 9 
10     pFungus->Fight();
11 
12     delete pFungus;
13     delete pTree;
14 
15     return 0;
16 }
复制代码

C#示例

CBaseFungus.cs

复制代码
 1 namespace Factory
 2 {
 3     class CBaseFungus
 4     {
 5         public CBaseFungus()
 6         {
 7 
 8         }
 9 
10         public virtual void Fight()
11         {
12             Console.WriteLine("Base fungus fight");
13         }
14     }
15 }
复制代码

CFungus.cs

复制代码
 1 namespace Factory
 2 {
 3     class CFungus: CBaseFungus
 4     {
 5         public CFungus()
 6         {
 7         }
 8 
 9         public override void Fight()
10         {
11             Console.WriteLine("Fungus fight");
12         }
13     }
14 }
复制代码

CTree.cs

复制代码
 1 namespace Factory
 2 {
 3     class CTree
 4     {
 5         public CTree()
 6         {
 7 
 8         }
 9 
10         public CFungus GetFungus()
11         {
12             return new CFungus();
13         }
14     }
15 }
复制代码

Program.cs

复制代码
 1 namespace Factory
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             CTree tree = new CTree();
 8             CFungus fungus = tree.GetFungus();
 9             fungus.Fight();
10         }
11     }
12 }
复制代码

 

1.如果一棵树可以生成不同的真菌,那么可以直接在创建方法中增加传递参数,通过参数来判断生成哪种真菌,也可以不同的真菌使用不同的函数来产生(2)。

2.如果一棵树现在生产的是真菌飞机,树升级后可以生产另一类真菌炮。目前的接口仅为真菌飞机服务的,新增的真菌炮如何生产?我们可以为树增加生产真菌炮的接口,然后在这个接口中专门生产真菌炮。

3.如果真菌飞机类型A1、A2,真菌炮类型B1、B2,不同的树T1、T2可以按不同的组合来生产,如何操作?这个时候采用抽象工厂模式,不同的树有着共同的接口,具体实现中,按各自的组合来分别实现接口。

 

posted on   阿呜的边城  阅读(198)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用
< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

导航

统计

点击右上角即可分享
微信分享提示