学习笔记——工厂模式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操作符直接生成对象会带来一些问题. ...
随机推荐
- SharePoint 网站登录不上,3次输入用户名/密码白页、
来源于:http://www.cnblogs.com/jianyus/p/3249091.html 新搭建的SharePoint 2013环境,第一次干的这么憋屈的慌,先是接了一个Ghost的服务器, ...
- Oracle SQL 内置函数大全
SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数;SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ...
- linux下制作u盘启动盘
格式化u盘为fat32 fdisk -l #查看U盘盘符,或者 df -T umount /dev/sdb #先卸载u盘 mkfs.vfat /dev/sdb #格式化为fat32模式,或者 mkfs ...
- MC 自己平均
using System; using System.Drawing; using System.Linq; using System.Collections; namespace PowerLang ...
- Android数据库--Sqlcipher的使用(二)
1.使用Sqlcipher对数据库加密,并结合ORM框架LitePal进行使用. 2.对LitePal的使用我就不在讲解了,大家可以参考下面七篇博客: http://blog.csdn.net/guo ...
- what a malloc has to do
1) Allocate a chunk of memory big enough to satisfy the request, and return a pointer to it.2) Remem ...
- Away 3d 入门demo
Away3d是不错的开源Flash 3D引擎,现在最新的版本是4.0,在这个例子中我们使用现在比较稳定的3.6版本,4.0API相较之前变化较大,支持最新的flash player11硬件加速 现在写 ...
- ios控件 UILabel
UILabel 的作用是显示文本 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 40)]; lab ...
- mysql中AES_ENCRYPT、AES_DNCRYPT及CONVERT的用法
这两天在弄公司的服务端项目的时候,发现mysql比较实用的3个函数,在这里给大家分享一下. 1.AES_ENCRYPT函数,这个函数的使用场景是对一些安全性要求比较高的数据使用AES加密,语法为: A ...
- Thinkphp与Ucenter整合笔记
ucenter手册:http://www.phpddt.com/manual/ucenter/html/index.htm 参考:http://www.thinkphp.cn/topic/1557.h ...