没有合适的资源?快使用搜索试试~ 我知道了~
常见设计模式及其实现(C++,带标签目录)
需积分: 9 3 下载量 22 浏览量
2015-05-06
11:09:28
上传
评论
收藏 904KB PDF 举报
温馨提示
常见设计模式及其UML图和C++的实现,加了标签目录,主要有factory,Abstract Factory, Builder, Prototype, Singleton, Adapt,Bridge, Composite, Decorator, Proxy, TemplateMethod, ChainOfReSpoNs等常用的二十个。
资源推荐
资源详情
资源评论
常见设计模式的解析和实现
常见设计模式的解析和实现(C+ + )之一-Factory 模式
作用:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一
个类的实例化延迟到其子类。
UML 结构图:
抽象基类:
1) Product:创建出来的对象的抽象基类.
2) Factory 创建对象的工厂方法的抽象基类.
接口函数:
l)Creator::FactoryMethod:纯虚函数,由派生类实现,创建出对应的 Product.
解析:
在这个模式中,有两个抽象基类,一个是 Product 为创建出来的对象的抽象基类,一个
是 Factory 是工厂的抽象基类,在互相协作的时候都是由相应的 Factory 派生类来生成
Product 的派生类,也就是说如果要新增一种 Product 那么也要对应的新增一个
Factory, 创 建 的 过 程 委 托 给 了 这 个 Factory. 也 就 是 说 一 个 Factory 和一个
Product 是一一对应的关系.
备注:
设计模式的演示图上把 Factory 类命名为 Creator,下面的实现沿用了这个命名.
演示实现:
//Factory.cpp
//factory模式演示
#include<iostream>
using namespace std;
class Product
{
public:
Product(){}
virtual ~Product(){}
};
class ConcreteProduct:public Product
{
public:
ConcreteProduct()
{ cout<<"construction of ConcreteProduct"<<endl; }
virtual ~ConcreteProduct()
{ cout<<"destruction of ConcreteProduct"<<endl; }
};
class Creator
{
public:
Creator(){}
virtual ~Creator(){}
void AnOperation()
{
Product* p = FactoryMethod();
cout<<"an operation of product"<<endl;
}
protected:
virtual Product* FactoryMethod()=0;
};
class ConcreteCreator:public Creator
{
public:
ConcreteCreator()
{ cout<<"construction of ConcreteCreator"<<endl; }
virtual ~ConcreteCreator()
{ cout<<"destruction of ConcreteCreator"<<endl; }
protected:
virtual Product* FactoryMethod()
{ return new ConcreteProduct(); }
};
int main()
{
Creator *p = new ConcreteCreator();
p->AnOperation();
delete p;
return 0;
}
常见设计模式的解析和实现(C++)之二-Abstract Factory 模式
作用:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
UML 结构图:
抽象基类:
1)ProductA,ProductB:分别代表不同类型的产品,而它们的派生类则是这种产品的一
个实现.
2)AbstractFactory:生产这一系列产品的一个抽象工厂,它的派生类是不同的实现.
接口函数:
1)AbstractFactory::CreateProductA 和 AbstractFactory::CreateProductB:
分别是生产不同产品的不同的实现,由各个派生出来的抽象工厂实现之.
解析:
Abstract Factory 模式和 Factory 最大的差别就是抽象工厂创建的是一系列相关的对象,
其中创建的实现其实采用的就是 Factory 模式的方法,对于某个实现的有一个派生出来的
抽象工厂,另一个实现有另一个派生出来的工厂,等等.
可以举一个简单的例子来解释这个模式:比如,同样是鸡腿(ProductA)和汉堡(Prod
UctB),它们都可以有商店出售(AbstractFactory),但是有不同的实现,有肯德基(C
OncreateFactoryl)和麦当劳(ConcreateFactory2)两家生产出来的不同风味的鸡
腿和汉堡(也就是 ProductA 和 ProductB 的不同实现),而负责生产汉堡和鸡腿的
就是之前提过的 Factory 模式了.
抽象工厂需要特别注意的地方就是区分不同类型的产品和这些产品的不同实现.显而易
见的,如果有 n 种产品同时有 m 中不同的实现,那么根据乘法原理可知有 n*m 个
Factory 模式的使用.
实现:
//abstract_factory.cpp
#include<iostream>
using namespace std;
//抽象基类AbstractProductA,代表产品A的抽象
class AbstractProductA
{
public:
AbstractProductA(){}
virtual ~AbstractProductA(){}
};//派生类ConcreateProductAl,继承自AbstractProductA,代表产品A的第一种实现
class ConcreateProductA1:public AbstractProductA
{
public:
ConcreateProductA1()
{ cout<<"ConcreateProdcutA1"<<endl; }
virtual ~ConcreateProductA1(){}
};
//派生类ConcreateProductA2,继承自AbstractProductA,代表产品A的第二种实现
class ConcreateProductA2:public AbstractProductA
{
public:
ConcreateProductA2()
{ cout<<"ConcreateProductA2"<<endl; }
virtual ~ConcreateProductA2(){}
};
//抽象基类AbstractProductB,代表产品B的抽象
class AbstractProductB
{
public:
AbstractProductB(){}
virtual ~AbstractProductB(){}
};
//派生类ConcreateProductB1,继承自AbstractProductB,代表产品B的第一种实现
class ConcreateProductB1:public AbstractProductB
{
public:
ConcreateProductB1()
{ cout<<"ConcreateProductB1"<<endl; }
virtual ~ConcreateProductB1(){}
};
//派生类ConcreateProductB2,继承自AbstractProductB,代表产品B的第二种实现
class ConcreateProductB2:public AbstractProductB
{
public:
ConcreateProductB2()
{ cout<<"ConcreateProductB2"<<endl; }
virtual ~ConcreateProductB2(){}
};
//抽象基类AbstractFactory,工厂的抽象类,生产产品A和产品B
class AbstractFactory
{
public:
AbstractFactory(){}
virtual ~AbstractFactory(){}
virtual AbstractProductA* CreateProductA()=0;
virtual AbstractProductB* CreateProductB()=0;
};
// 派生类 ConcreateFactoryl,继承自 AbstractFactory,生产产品A和产品B的第一种实现class
ConcreteFactory1:public AbstractFactory
{
public:
ConcreteFactory1()
{ cout<<"ConcreteFactory1"<<endl; }
virtual ~ConcreteFactory1(){}
virtual AbstractProductA* CreateProductA()
{ return new ConcreateProductA1(); }
virtual AbstractProductB* CreateProductB()
{ return new ConcreateProductB1(); }
};
剩余50页未读,继续阅读
资源评论
穿拖鞋喜欢雷的饭
- 粉丝: 2
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 强化学习控制电动汽车储能系统的Matlab项目.rar
- 强化学习算法的基准案例:网格世界和推车上的倒立摆Matlab代码.rar
- 天邦达上位机软件2.35
- 轻型包裹运输的自主无人机递送系统附matlab代码.rar
- 深度强化学习应用无人机附python代码.rar
- 人类强化学习中的无模型过程Matlab代码.rar
- 设计和开发一种受蝙蝠启发的微型无人机,可以通过救援和监视行动协助灾害管理matlab代码.rar
- 实现分层强化学习算法Matlab实现.rar
- 使用 FDM 和 PWE 方法计算谐振微腔中麦克斯韦方程组的解matlab代码.rar
- 使用 EKF 的 Cubesat 姿态确定Matlab代码.rar
- Matlab实现TSOA-CNN-GRU-Mutilhead-Attention凌日优化算法优化卷积门控循环单元融合多头注意力机制多特征分类预测(含完整的程序,GUI设计和代码详解)
- 使用MATLAB的平方根无迹卡尔曼滤波器(SR-UKF)的简单、快速、可读的实现.rar
- 使用EKF、IECF和UKF估算非线性预测和测量Matlab代码.rar
- 基于Python语言的OpenSees算例(重点在于Python语言在OpenSees中的应用)
- 使用了随机梯度下降法(SGD)和批量梯度下降法(BGD)解决单层感知机问题Matlab代码.rar
- c语言课程设计-ktv歌曲系统
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功