您好,欢迎访问三七文档
设计模式王舰2013-6-15单例设计模式(Singleton)•单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。•其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。•有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。#includeiostreamusingnamespacestd;classSingleton{private:staticSingleton*instance;Singleton(){}public:~Singleton(){deleteinstance;}staticSingleton*GetInstance(){if(NULL==instance){instance=newSingleton();}returninstance;}};Singleton*Singleton::instance=NULL;intmain(){Singleton*s1=Singleton::GetInstance();Singleton*s2=Singleton::GetInstance();couts1s2endl;return0;}工厂模式•简单工厂模式(SimpleFactory)•工厂方法模式(FactoryMethod)•抽象工厂模式(AbstractFactory)简单工厂模式•又称为静态工厂方法模式。它存在的目的很简单:定义一个用于创建对象的接口。•组成:•工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。一般是一个具体类实现。•抽象产品角色:它一般是具体产品继承的或实现的接口。一般是一个抽象类来实现。•具体产品角色:工厂类所创建的对象就是此角色。一般由一个具体类实现。•//产品基类classProduct{public:virtual~Product(void){};virtualvoidFunction()=0;};•//产品A,BclassProductA:publicProduct{public:ProductA(void);public:virtual~ProductA(void);public:virtualvoidFunction();};•voidProductA::Function(){cout这是产品A具有的基本功能endl;}•//工厂类•classSimpleFactory{public:SimpleFactory(){}~SimpleFactory(){}public:Product*CreateProduct(intProuctType);Product*CreateProductA();Product*CreateProductB();};Product*SimpleFactory::CreateProduct(intProductType=0){Product*p=0;switch(ProductType){case0:p=newConcreteProductA();break;case1:p=newConcreteProductB();break;default:p=newConcreteProductA();break;}returnp;}Product*SimpleFactory::CreateProductA(){returnnewProductA();}Product*SimpleFactory::CreateProductB(){returnnewProductB();}•客户端程序:访问的角色包括产品基类、工厂类。不直接访问具体产品类。•SimpleFactorysf;Product*p=sf.CreateProductA();p-Function();deletep;p=sf.CreateProductB();p-Function();deletep;简单工厂模式的缺点•对修改不封闭,新增加产品您要修改工厂。违法了鼎鼎大名的开闭法则(OCP)。工厂方法模式•产品基类:同简单工厂的产品基类。具体产品类:也是用的简单工厂的具体产品类,为了体现对修改的关闭这里为系统新添加了一个具体产品类,就是“新产品。•工厂基类:定义了工厂创建产品的接口,但是没有实现,具体创建工作由其继承类实现。•工厂基类•classFactory{public:Factory(void);virtual~Factory(void);public:virtualProduct*CreateProduct(intProductType=0)=0;};•//工厂实现classConcreteFactory1:publicFactory{public:ConcreteFactory1();public:virtual~ConcreteFactory1();public:Product*CreateProduct(intProductType);};•Product*ConcreteFactory1::CreateProduct(intProductType=0){returnnewConcreteProductANew();}•客户端调用•Factory*fct=newConcreteFactory1();Product*p=fct-CreateProduct(0);p-Function();deletep;p=fct-CreateProduct(1);p-Function();deletep;deletefct;fct=newConcreteFactory2();p=fct-CreateProduct();deletep;deletefct;抽象工厂模式•产品基类:这里包含产品基类A和产品基类B,实际上在示例代码中,这两个产品都从共同的基类继承而来,但是这个继承关系却是在这个模式之外的部分,而本身这个模式关心的是这两个产品基类的差异部分。•工厂抽象接口:定义了创建产品的接口,这里返回参数是返回的产品A,产品B,而非本身产品A和B的共同基类,个人认为正是这个特征构成了抽象工厂和工厂模式的区别。代码实现•//抽象工厂模式•classAbstractFactory{public:AbstractFactory();public:virtual~AbstractFactory();public:virtualConcreteProductA*CreateA()=0;virtualConcreteProductB*CreateB()=0;};•//具体实现•classConcreteAbsFactory1:publicAbstractFactory{public:ConcreteAbsFactory1();public:virtual~ConcreteAbsFactory1();public:virtualConcreteProductA*CreateA();virtualConcreteProductB*CreateB();};•ConcreteProductA*ConcreteAbsFactory1::CreateA(){returnnewConcreteProductA1();}ConcreteProductB*ConcreteAbsFactory1::CreateB(){returnnewConcreteProductB1();}•//客户端•AbstractFactory*absfct=newConcreteAbsFactory1();ConcreteProductA*cpa=absfct-CreateA();cpa-Function();deletecpa;ConcreteProductB*cpb=absfct-CreateB();cpb-Function();deletecpb;deleteabsfct;absfct=newConcreteAbsFactory2();cpa=absfct-CreateA();cpa-Function();deletecpa;cpb=absfct-CreateB();cpb-Function();deletecpb;工厂模式总结•和工厂模式的分析比较现在可以和工厂模式对比一下,抽象工厂返回的接口不再是产品A和产品B的共同基类Product了,而是产品A、产品B基类(在工厂模式中它们为具体实现类,这里变成了基类)了。此时工厂的抽象和简单工厂中的工厂方法也很类似,就是这些特征区使其别于工厂模式而变成抽象工厂模式了,因此抽象工厂解决的是创建一系列有共同风格的产品(鲁菜还是粤菜),而工厂方法模式解决的创建有共同特征的一系列产品(红烧肉、清蒸鱼它们都是食物)。当然简单工厂的缺陷在抽象工厂中又再次出现了,我要新增加一个产品,工厂抽象接口就要改变了。因此抽象工厂并不比工厂模式完美,只不过是各自的适用领域不同而已。其实,这里如果把抽象工厂模式的接口返回产品A和产品B的共同基类(工厂模式返回的参数),你会发现,奇怪这个模式怎么这么眼熟,它不是恰恰退化成工厂模式了。工厂模式总结•工厂本质就是用工厂方法替代直接New来创建对象。这里不是指的让用户重载一个新操作符号来进行创建对象的操作,而是说把New操作封装在一个方法中,等用户需要创建对象时调用此方法而避免直接使用New而已。这样做的目的就是封装,避免代码中大量New的运算符,这当然不是主要目的,因为这样虽然New少了,CreateObject方法却多了,但是如果产品类的构造函数变了,我想常用工厂模式的修改源代码的工作应该简便许多吧,当然这算不上这个模式的好处,它的真正强大的功能其实在于适应变化,这也是整个设计模式最根本的目的;还有一点就是体现了抽象于实现的分离,当然创建型模式都具有这个特点,工厂模式非常明显吧了,把具体创建工作放置到工厂中,使客户端程序更专注与业务逻辑的,这样的代码结构也更进行合理。
本文标题:设计模式
链接地址:https://www.777doc.com/doc-3362479 .html