C++ 设计模式
2014-05-07 15:58
337 查看
单例模式:
单例模式作为一种策略,要求一个程序只能存在一个类的实例。单例模式可以保证一个类只会创建一个这个类的对象。#include <iostream> using namespace std; class singleTon{ public: static singleTon* instance(){ if(0==instance1){ instance1 = new singleTon(); } return instance1; } protected: //不允许进行实例化 可以设置为protected 或者是private singleTon(){ cout<<"single..."<<endl; } ~singleTon(){} private: static singleTon* instance1; }; singleTon* singleTon::instance1 = 0; int main() { singleTon* single = singleTon::instance(); singleTon* single1 = singleTon::instance(); return 0; }产生结果只有一个:
下面讲述另一种模式:
工厂模式
为了提高内聚和松耦合,一般都会抽象出一些类的公共接口形抽象基类或者接口,于此同时问题也就产生,很多的子类的都继承这个基类,我们必须知道子类的具体实现,这样会引起命名上的冲突,还有对以后的程序维护上是很困难的。还有另一个问题就是在父类中并不知道要具体实现哪一个子类。基于以上2点,引出了工厂模式。工厂模式的特点:
1. 定义创建对象的接口,封装了对象的创建。
2. 使得实例化的具体操作延迟到了子类当中去了。
#include <iostream> using namespace std; class car{ public: car(){} virtual ~car(){} virtual void info() = 0; //一个类的公共接口 }; class Ford:public car{ public: Ford(){} virtual ~Ford(){} virtual void info(){ cout<<"Ford"<<endl; } }; class Toyota:public car{ public: Toyota(){} virtual ~Toyota(){} virtual void info(){ cout<<"Toyota"<<endl; } }; class carFactory{ public: carFactory():mNumcars(0){} car* requestCar(){ mNumcars++; return createCar(); } int getNumCars() const{ return mNumcars; } protected: virtual car* createCar() = 0; //一个工厂的抽象方法 等待不同的子工厂进行具体实例化(是到Ford还是到Toyota买车) private: int mNumcars; }; class FordFactory:public carFactory{ protected: virtual car* createCar(){ //具体的实现,来到了Ford工厂 才可以创建一个 Ford车。 return new Ford(); } }; class ToyotaFactory:public carFactory{ protected: virtual car* createCar(){ //实例化一个Toyota车 return new Toyota(); } }; int main() { ToyotaFactory mycar; car* xdcar = mycar.requestCar(); //父类指针指向了子类对象 xdcar->info(); delete xdcar; //虚析构(父类指针派生类的对象) FordFactory ford; car* fordcar = ford.requestCar(); (*fordcar).info(); delete fordcar; //虚析构(父类指针派生类的对象) cout<<mycar.getNumCars()<<endl; //向Ford厂商,Toyota厂商请求买车 cout<<ford.getNumCars()<<endl; return 0; }测试结果:
对于以上的工厂模式,只是仅仅局限于一类类(Product是一类,有一个共同的基类),但要是为不同的类提供一个对象创建的接口,就需要引入抽象工厂模式。
抽象工厂模式:
抽象工厂模式,当有多个抽象角色的时候,使用的一种工厂模式,只是向客户端提供一种接口,使得客户端不必在指定具体产品情况下,创建多个产品族中的产品对象。总之,要创建一组相关或是相互依赖的对象,无需指定他们的具体类。
代码如下:
#include <iostream> using namespace std; class AbstractProductA{ public: AbstractProductA(){} virtual ~AbstractProductA(){} }; class ProductA1:public AbstractProductA{ public: ProductA1(){ cout<<"create A1"<<endl; } ~ProductA1(){} }; class ProductA2:public AbstractProductA{ public: ProductA2(){ cout<<"create A2"<<endl; } ~ProductA2(){} }; class AbstractProductB{ public: AbstractProductB(){} virtual ~AbstractProductB(){} }; class ProductB1:public AbstractProductB{ public: ProductB1(){ cout<<"create B1"<<endl; } ~ProductB1(){} }; class ProductB2:public AbstractProductB{ public: ProductB2(){ cout<<"create B2"<<endl; } ~ProductB2(){} }; class AbstractFactory{ public: AbstractFactory(){} virtual ~AbstractFactory(){} virtual AbstractProductA* createProductA()=0; virtual AbstractProductB* createProductB()=0; }; class concreteFactory1:public AbstractFactory{ public: concreteFactory1(){} ~concreteFactory1(){} AbstractProductA* createProductA(){ return new ProductA1(); } AbstractProductB* createProductB(){ return new ProductB1(); } }; class concreteFactory2:public AbstractFactory{ public: concreteFactory2(){} ~concreteFactory2(){} AbstractProductA* createProductA(){ return new ProductA2(); } AbstractProductB* createProductB(){ return new ProductB2(); } }; int main() { AbstractFactory* f1 = new concreteFactory1(); f1->createProductA(); f1->createProductB(); AbstractFactory* f2 = new concreteFactory2(); f2->createProductA(); f2->createProductB(); delete f1; delete f2; return 0; }
Builder模式:
builder-pattern是将复杂对象的建造过程抽象出来,使用不同的方法可以构造出不同表现的对象。即要将对象的创建过程和对象的表示分开来,通过一步步的进行复杂的对象创建,在每一步的创建过程中输入不同的参数,使得经过相同的创建过程,但是最后得到的对象的展示是不同的。一般使用情形:到构造过程必须允许被创建的对象有不同的表示。
builder模式逻辑图:
C++测试代码:
#include <iostream> using namespace std; class Product{ public: Product(){ cout<<"generate a product"<<endl; } ~Product(){} }; class Builder{ public: Builder(){} virtual ~Builder(){} virtual void BuilderA(const string& buildPara)=0; virtual void BuilderB(const string& buildPara)=0; virtual void BuilderC(const string& buildPara)=0; virtual Product* getPro()=0; }; class concreteBuilder:public Builder{ public: concreteBuilder(){} ~concreteBuilder(){} void BuilderA(const string& buildPara){ cout<<"stepA generate"<<"...."<<buildPara<<endl; } void BuilderB(const string& buildPara){ cout<<"stepB generate"<<"...."<<buildPara<<endl; } void BuilderC(const string& buildPara){ cout<<"stepC generate"<<"...."<<buildPara<<endl; } Product* getPro(){ BuilderA("stepA---"); BuilderB("stepB---"); BuilderC("stepC---"); return new Product(); } }; class Director{ public: Director(Builder* bld):build(bld){} ~Director(){ delete build; } void Construct(){ build->BuilderA("1"); build->BuilderB("2"); build->BuilderC("3"); } protected: Builder *build; }; int main() { concreteBuilder *p = new concreteBuilder(); Director *d = new Director(p); d->Construct(); p->getPro(); return 0; }
原型模式:
原型模式提供了自我复制的功能,新对象的创建可以通过已有对象进行创建。#include <iostream> using namespace std; class Prototype{ public: Prototype(){ cout<<"this is prototype"<<endl; } virtual ~Prototype(){} virtual Prototype* clone()=0; }; class concretePrototype:public Prototype{ public: concretePrototype(){} concretePrototype(const concretePrototype& cp){ cout<<"return the index of concretePrototype"<<endl; } ~concretePrototype(){} Prototype* clone(){ return new concretePrototype(*this); } }; int main() { Prototype *p = new concretePrototype(); p->clone(); delete p; return 0; }
相关文章推荐
- c++设计模式之备忘录模式
- 设计模式——代理模式(C++)
- 设计模式-工厂模式-C++
- 设计模式C++实现(1)——工厂模式
- 设计模式---迭代器模式(C++实现)
- 笔记--设计模式精解c++-GoF 23 种设计模式解析
- C++设计模式之享元模式(FlyWeight)
- C++设计模式——策略模式
- 设计模式C++实现--职责链模式
- c++设计模式之装饰者模式
- 设计模式C++实现(9)——享元模式
- C++中的设计模式之单例模式
- C++设计模式——桥接模式
- 设计模式C++实现(2)——策略模式
- C++设计模式之迭代器模式
- C++学习笔记(二十六)设计模式学习之单例模式
- 设计模式C++实现_2_简单工厂模式
- C++设计模式之 简单工厂模式讲解(历史上最简单明白的例子)
- 设计模式之单例模式(Singleton Pattern)C++实现
- c++设计模式—观察者模式