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的更多相关文章

  1. C#学习笔记-工厂模式

    题目:计算器 解析:工厂方法(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类. 定义运算类: class Operation { ; ; public doubl ...

  2. Java-马士兵设计模式学习笔记-工厂模式-抽象工厂模式

    一.概述 1.抽象工厂:当情况是需要产生一系列产品,若需更换产品,则要求一系列产品一起换,且要控制一系列产品的产生过程,此时可考虑抽象工厂模式.例:小明装修屋子,把电视.冰箱都替换掉,他这次需要把电视 ...

  3. 《Head First 设计模式》学习笔记——工厂模式 + 抽象工厂模式

    设计模式 工厂模式:定义一个创建对象的接口,但由子类决定要实例化的是哪一个.工厂方法让类把实例化推迟到子类. 所谓的"决定",并非指模式同意子类本身在执行时做决定,而是指在编写创建 ...

  4. Java-马士兵设计模式学习笔记-工厂模式-简单工厂

    一.概述 1.目标:要控制任意类型交通工具的生产模式 2.目标有两层意思(1)任意类型 (2)生产模式,所以对应的,要这两个层面上抽象(Movable,VehicleFactory),利用接口,实现多 ...

  5. Java-马士兵设计模式学习笔记-工厂模式-用Jdom模拟Spring

    一.概述 1.目标:模拟Spring的Ioc 2.用到的知识点:利用jdom的xpath读取xml文件,反射 二.有如下文件: 1.applicationContext.xml <?xml ve ...

  6. Java-马士兵设计模式学习笔记-工厂模式-模拟Spring读取Properties文件

    一.目标:读取properties文件,获得类名来生成对象 二.类 1.Movable.java public interface Movable { void run(); } 2.Car.java ...

  7. Java-马士兵设计模式学习笔记-工厂模式-单例及多例

    一.单例的作用是用于控制类的生成方式,而不让外部类任意new对象 1.Car.java import java.util.ArrayList; import java.util.List; publi ...

  8. 工厂模式 - Factory

    简单工厂模式 SimpleFactory Pattern,将一个具体类的实例化交给一个静态工厂方法来执行. 特点: 增加功能需要修改工厂类,扩展性较差: 参考: 设计模式学习笔记 - 简单工厂模式: ...

  9. 设计模式(一)工厂模式Factory(创建型)

    设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. ...

随机推荐

  1. html5标准格式示代码

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  2. UILabel设置富文本格式显示

    实例化方法和使用方法 实例化方法: 使用字符串初始化 - (id)initWithString:(NSString *)str; 例: NSMutableAttributedString *Attri ...

  3. C++常用库函数

    C++常用库函数  转自:http://blog.csdn.net/sai19841003/article/details/7957115 1.常用数学函数 头文件 #include <math ...

  4. ecos 问题答疑(转)

    1.为什么我购买的是源码版,但是我的base/ego.php(或者base/ego/目录下文件)却是加密的?  答:ego 源码商业授权文件仅用于和商派软件签订源码协议的商业用户按照甲乙的源码保护约定 ...

  5. 29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

    //Vehicle类 package d922A; public class Vehicle { private int wheels; private double weight; Vehicle( ...

  6. ELK 基本搭建

    ELK是一套日志分析系统: 开发人员不能登录线上服务器查看详细日志各个系统都有日志,日志数据分散难以查找日志数据量大,查询速度慢,或者数据不够实时一个调用会设计多个系统,难以在这些系统的日志中快速定位 ...

  7. opencv轮廓处理函数详细

    ApproxChains 用多边形曲线逼近 Freeman 链 CvSeq* cvApproxChains( CvSeq* src_seq, CvMemStorage* storage, int me ...

  8. scanf函数与scanf_s函数

    ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内存泄露.所以vc++2005/2008中提供了scanf_s(),在最新的VS2013中也提 ...

  9. Linux自动修改IP脚本(手动编写)

    #!/bin/bashnetmask=255.255.255.0IP_PATH=/etc/sysconfig/network-scripts/ifcfg-eth0GM_PATH=/etc/syscon ...

  10. 理解VMware虚拟机下网络连接的三种模式(如何配置虚拟机上网)

    很多朋友都用vmware来测试不同的系统,我结合自己的经验谈一下对网络设置的理解,不对的地方请指正. bridge:这种方式最简单,直接将虚拟网卡桥接到一个物理网卡上面,和linux下一个网卡 绑定两 ...