设计模式——工厂方法模式(Factory Method Pattern)
2016-07-12 08:45
447 查看
工厂方法模式不同于简单工厂模式的地方在于工厂方法模式把对象的创建过程放到里子类里。这样工厂父对象和产品父对象一样,可以是抽象类或者接口,只定义相应的规范或操作,不涉及具体的创建或实现细节。
其类图如下:
实例代码为:
[cpp] view
plain copy
#pragma once
class IProduct
{
public:
IProduct(void);
virtual ~IProduct(void);
};
#pragma once
#include "iproduct.h"
class IPad :
public IProduct
{
public:
IPad(void);
~IPad(void);
};
#pragma once
#include "iproduct.h"
class IPhone :
public IProduct
{
public:
IPhone(void);
~IPhone(void);
};
[cpp] view
plain copy
#pragma once
#include"IProduct.h"
class IFactory
{
public:
IFactory(void);
virtual ~IFactory(void);
virtual IProduct* getProduct();
};
#pragma once
#include "ifactory.h"
class IPadFactory :
public IFactory
{
public:
IPadFactory(void);
~IPadFactory(void);
virtual IProduct* getProduct();
};
#pragma once
#include "ifactory.h"
class IPhoneFactory :
public IFactory
{
public:
IPhoneFactory(void);
~IPhoneFactory(void);
virtual IProduct* getProduct();
};
关键的实现:
[cpp] view
plain copy
#include "StdAfx.h"
#include "IPadFactory.h"
#include"IPad.h"
IPadFactory::IPadFactory(void)
{
}
IPadFactory::~IPadFactory(void)
{
}
IProduct* IPadFactory::getProduct()
{
return new IPad();
}
#include "StdAfx.h"
#include "IPhoneFactory.h"
#include"IPhone.h"
IPhoneFactory::IPhoneFactory(void)
{
}
IPhoneFactory::~IPhoneFactory(void)
{
}
IProduct* IPhoneFactory::getProduct()
{
return new IPhone();
}
调用方式:
[cpp] view
plain copy
#include "stdafx.h"
#include"IFactory.h"
#include"IPadFactory.h"
#include"IPhoneFactory.h"
#include"IProduct.h"
int _tmain(int argc, _TCHAR* argv[])
{
IFactory *fac = new IPadFactory();
IProduct *pro = fac->getProduct();
fac = new IPhoneFactory();
pro = fac->getProduct();
return 0;
}
应用场景:
1. .net里面的数据库连接对象就是产生数据命令对象的工厂。每种数据库的connection对象里(继承自IDbConnection)都有对自己createCommand(定义在IDbCommand里)的实现。
2. .net里面的迭代器,IEnumerable定义了迭代器的接口,即工厂方法,每一个继承自IEnumerable的类都要实现GetEnumerator。可以参看ArrayList,String的GetEnumerator方法。他们都继承自IEnumerable。
参考资料:
1.Dot Net设计模式—工厂方法模式 http://fineboy.cnblogs.com/archive/2005/08/04/207459.html
2.工厂方法模式 http://www.cnblogs.com/cbf4life/archive/2009/12/20/1628494.html
LCL_data原创于CSDN.Net【http://blog.csdn.net/lcl_data/article/details/8712834】
顶6
踩
其类图如下:
实例代码为:
[cpp] view
plain copy
#pragma once
class IProduct
{
public:
IProduct(void);
virtual ~IProduct(void);
};
#pragma once
#include "iproduct.h"
class IPad :
public IProduct
{
public:
IPad(void);
~IPad(void);
};
#pragma once
#include "iproduct.h"
class IPhone :
public IProduct
{
public:
IPhone(void);
~IPhone(void);
};
[cpp] view
plain copy
#pragma once
#include"IProduct.h"
class IFactory
{
public:
IFactory(void);
virtual ~IFactory(void);
virtual IProduct* getProduct();
};
#pragma once
#include "ifactory.h"
class IPadFactory :
public IFactory
{
public:
IPadFactory(void);
~IPadFactory(void);
virtual IProduct* getProduct();
};
#pragma once
#include "ifactory.h"
class IPhoneFactory :
public IFactory
{
public:
IPhoneFactory(void);
~IPhoneFactory(void);
virtual IProduct* getProduct();
};
关键的实现:
[cpp] view
plain copy
#include "StdAfx.h"
#include "IPadFactory.h"
#include"IPad.h"
IPadFactory::IPadFactory(void)
{
}
IPadFactory::~IPadFactory(void)
{
}
IProduct* IPadFactory::getProduct()
{
return new IPad();
}
#include "StdAfx.h"
#include "IPhoneFactory.h"
#include"IPhone.h"
IPhoneFactory::IPhoneFactory(void)
{
}
IPhoneFactory::~IPhoneFactory(void)
{
}
IProduct* IPhoneFactory::getProduct()
{
return new IPhone();
}
调用方式:
[cpp] view
plain copy
#include "stdafx.h"
#include"IFactory.h"
#include"IPadFactory.h"
#include"IPhoneFactory.h"
#include"IProduct.h"
int _tmain(int argc, _TCHAR* argv[])
{
IFactory *fac = new IPadFactory();
IProduct *pro = fac->getProduct();
fac = new IPhoneFactory();
pro = fac->getProduct();
return 0;
}
应用场景:
1. .net里面的数据库连接对象就是产生数据命令对象的工厂。每种数据库的connection对象里(继承自IDbConnection)都有对自己createCommand(定义在IDbCommand里)的实现。
2. .net里面的迭代器,IEnumerable定义了迭代器的接口,即工厂方法,每一个继承自IEnumerable的类都要实现GetEnumerator。可以参看ArrayList,String的GetEnumerator方法。他们都继承自IEnumerable。
参考资料:
1.Dot Net设计模式—工厂方法模式 http://fineboy.cnblogs.com/archive/2005/08/04/207459.html
2.工厂方法模式 http://www.cnblogs.com/cbf4life/archive/2009/12/20/1628494.html
LCL_data原创于CSDN.Net【http://blog.csdn.net/lcl_data/article/details/8712834】
顶6
踩
相关文章推荐
- 2016.7.12c语言的特点左右法则,内存
- 什么是DOM
- 面试题21:包含min函数的栈
- hadoop之hbase学习
- SQL Server 并行操作优化,避免并行操作被抑制而影响SQL的执行效率
- 自己手写简约实用的Jquery tabs插件(基于bootstrap环境)
- 在 Linux 中安装 Lighttpd Web 服务器
- 百度手机浏览器能听会看,实现移动生活全程自然交互
- POJ 2081
- Axis2 Web 服务配置文件services.xml
- 瀑布流ul带图片版
- JNDI到底是什么,有什么作用
- 使用 ShellExecuteEx 显示文件属性
- HDU1019(基础题)
- Ubuntu录制gif动态图
- APP开放源码第一弹《纳豆》
- grep使用杂记
- 遍历给定目录并将特定文件的名字写入文件
- Linux下RTL8723BE无线网卡驱动问题解决方法
- 操作系统的ContentProvider 读写联系人