学习笔记——工厂模式Factory

Product是我们所需要获得的对象,一般的使用中,我们直接通过new获得新对象。
当需要大量获得对象时,每一次都new会很麻烦。
《真菌世界》游戏中,一个星球上有很多树,一棵树会不断生成真菌。星球是场景,树就是工厂,真菌就是产品。场景不用关心如何生成一种特定类型的真菌,真菌的属性由生产它的工厂负责就行了。
简单代码示例:
C++示例
BaseFungus.h
#pragma once
class CBaseFungus
{
public:
CBaseFungus(void);
~CBaseFungus(void);
public:
virtual void Fight();
};
BaseFungus.cpp
#include "BaseFungus.h"
#include <iostream> CBaseFungus::CBaseFungus(void)
{
} CBaseFungus::~CBaseFungus(void)
{
} void CBaseFungus::Fight()
{
std::cout<<"Base fungus fight"<<std::endl;
}
Fungus.h
#pragma once
#include "basefungus.h"
class CFungus :
public CBaseFungus
{
public:
CFungus(void);
~CFungus(void);
public:
void Fight();
};
Fungus.cpp
#include "Fungus.h"
#include <iostream> CFungus::CFungus(void)
{
} CFungus::~CFungus(void)
{
} void CFungus::Fight()
{
std::cout<<"Fungus fight"<<std::endl;
}
Tree.h
#pragma once
#include "BaseFungus.h" class CTree
{
public:
CTree(void);
~CTree(void);
public:
CBaseFungus* GetFungus();
};
Tree.cpp
#include "Tree.h"
#include "Fungus.h" CTree::CTree(void)
{
} CTree::~CTree(void)
{
} CBaseFungus* CTree::GetFungus()
{
return new CFungus();
}
main.cpp
#include <iostream>
#include "Tree.h"
using namespace std; int main()
{
CTree* pTree = new CTree();
CBaseFungus* pFungus = pTree->GetFungus(); pFungus->Fight(); delete pFungus;
delete pTree; return ;
}
C#示例
CBaseFungus.cs
namespace Factory
{
class CBaseFungus
{
public CBaseFungus()
{ } public virtual void Fight()
{
Console.WriteLine("Base fungus fight");
}
}
}
CFungus.cs
namespace Factory
{
class CFungus: CBaseFungus
{
public CFungus()
{
} public override void Fight()
{
Console.WriteLine("Fungus fight");
}
}
}
CTree.cs
namespace Factory
{
class CTree
{
public CTree()
{ } public CFungus GetFungus()
{
return new CFungus();
}
}
}
Program.cs
namespace Factory
{
class Program
{
static void Main(string[] args)
{
CTree tree = new CTree();
CFungus fungus = tree.GetFungus();
fungus.Fight();
}
}
}
1.如果一棵树可以生成不同的真菌,那么可以直接在创建方法中增加传递参数,通过参数来判断生成哪种真菌,也可以不同的真菌使用不同的函数来产生(2)。
2.如果一棵树现在生产的是真菌飞机,树升级后可以生产另一类真菌炮。目前的接口仅为真菌飞机服务的,新增的真菌炮如何生产?我们可以为树增加生产真菌炮的接口,然后在这个接口中专门生产真菌炮。
3.如果真菌飞机类型A1、A2,真菌炮类型B1、B2,不同的树T1、T2可以按不同的组合来生产,如何操作?这个时候采用抽象工厂模式,不同的树有着共同的接口,具体实现中,按各自的组合来分别实现接口。
学习笔记——工厂模式Factory的更多相关文章
- C#学习笔记-工厂模式
题目:计算器 解析:工厂方法(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类. 定义运算类: class Operation { ; ; public doubl ...
- Java-马士兵设计模式学习笔记-工厂模式-抽象工厂模式
一.概述 1.抽象工厂:当情况是需要产生一系列产品,若需更换产品,则要求一系列产品一起换,且要控制一系列产品的产生过程,此时可考虑抽象工厂模式.例:小明装修屋子,把电视.冰箱都替换掉,他这次需要把电视 ...
- 《Head First 设计模式》学习笔记——工厂模式 + 抽象工厂模式
设计模式 工厂模式:定义一个创建对象的接口,但由子类决定要实例化的是哪一个.工厂方法让类把实例化推迟到子类. 所谓的"决定",并非指模式同意子类本身在执行时做决定,而是指在编写创建 ...
- Java-马士兵设计模式学习笔记-工厂模式-简单工厂
一.概述 1.目标:要控制任意类型交通工具的生产模式 2.目标有两层意思(1)任意类型 (2)生产模式,所以对应的,要这两个层面上抽象(Movable,VehicleFactory),利用接口,实现多 ...
- Java-马士兵设计模式学习笔记-工厂模式-用Jdom模拟Spring
一.概述 1.目标:模拟Spring的Ioc 2.用到的知识点:利用jdom的xpath读取xml文件,反射 二.有如下文件: 1.applicationContext.xml <?xml ve ...
- Java-马士兵设计模式学习笔记-工厂模式-模拟Spring读取Properties文件
一.目标:读取properties文件,获得类名来生成对象 二.类 1.Movable.java public interface Movable { void run(); } 2.Car.java ...
- Java-马士兵设计模式学习笔记-工厂模式-单例及多例
一.单例的作用是用于控制类的生成方式,而不让外部类任意new对象 1.Car.java import java.util.ArrayList; import java.util.List; publi ...
- 工厂模式 - Factory
简单工厂模式 SimpleFactory Pattern,将一个具体类的实例化交给一个静态工厂方法来执行. 特点: 增加功能需要修改工厂类,扩展性较差: 参考: 设计模式学习笔记 - 简单工厂模式: ...
- 设计模式(一)工厂模式Factory(创建型)
设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. ...
随机推荐
- C# 验证码生成(MVC和非MVC两种方式)
/// <summary> /// 生成验证码 /// </summary> /// <param name="length">指定验证码的长度 ...
- 汇总jQuery的61种选择器及示例
汇总jQuery的61种选择器及示例 恋痿喃 ㄍń稀广 因罘乐睽 ú燔蒇 骤幄觳 ч豹 齑骝氮铷 宅廓Ω孓 锏遒 荛猩ㄜ彬 芡钷ж ┊贩错鹌 掩饰着可还是几步就窜到了门口看着这个让她 ...
- mysql常用命令使用技巧
一.连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root - ...
- cPanel 安装方法
. 如何安装cPanel/WHM? 答:安装过程较长,建议使用screen或nohupscreen: yum -y install screen perl screen -S cpanel cd /h ...
- JavaScript在智能手机上的应用-测试是否支持滑动事件
---------------------------- <script type="text/javascript"> ...
- nefu 196 让气球飞吧
description 国际大学生程序设计竞赛已经发展成为最具影响力的大学生计算机竞赛,ACM-ICPC以团队的形式代表各学校参赛,每队由3名队员组成,一个队每做出来一个题该队就会获得该题对应颜色的气 ...
- 构造DataTable
手动构造一个DataTable: DataTable dt = new DataTable(); dt.Columns.Add("ID", typeof(string)); dt. ...
- chrome 常用快捷操作
Chrome窗口和标签页快捷键: Ctrl+N 打开新窗口 Ctrl+T 打开新标签页 Ctrl+Shift+N 在隐身模式下打开新窗口 Ctrl+O,然后选择文件,在谷歌浏览器中打开计算机上的文件 ...
- Nginx配置性能优化与压力测试webbench【转】
这一篇我们来说Nginx配置性能优化与压力测试webbench. 基本的 (优化过的)配置 我们将修改的唯一文件是nginx.conf,其中包含Nginx不同模块的所有设置.你应该能够在服务器的/et ...
- viewpager处理(一):让viewpager不能滑动
1.实现原理: 自定义viewpager,重写onTouchEvent方法,什么触摸事件都不响应即可让viewpager不能滑动. 2.代码如下 public class NoScrollViewPa ...