zoukankan      html  css  js  c++  java
  • 设计模式C++代码实例(一)

     1.简单工厂模式(Simple Factory Pattern)

    一个工厂生产所有的产品,根据输入参数决定产品的种类。

    #include "Factory.h"
    #include "ProductA.h"
    #include "ProductB.h"
    Product* Factory::createProduct(string proname) {
    	if ("A" == proname)
    	{
    		return new ProductA();
    	}
    	else if ("B" == proname)
    	{
    		return new ProductB();
    	}
    	return  NULL;
    }
    

    2.工厂方法模式

    一个具体的工厂对应着一个具体的产品。

    具体的工厂类继承自工厂基类:

    ///////////////////////////////////////////////////////////
    //  ConcreteFactory.cpp
    //  Implementation of the Class ConcreteFactory
    ///////////////////////////////////////////////////////////
    
    #include "ConcreteFactory.h"
    #include "ConcreteProduct.h"
    
    Product* ConcreteFactory::factoryMethod(){
    
    	return  new ConcreteProduct();
    }
    

     主程序中只需要创造工厂,而不需要知道工厂具体的产品。

    #include "Factory.h"
    #include "ConcreteFactory.h"
    #include "Product.h"
    #include <iostream>
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    	Factory * fc = new ConcreteFactory();
    	Product * prod = fc->factoryMethod();
    	prod->use();
    	
    	delete fc;
    	delete prod;
    	
    	return 0;
    }
    

    3.抽象工厂

    当系统所提供的工厂所需要的生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品需要使用抽象工厂模式。

    #include <iostream>
    #include "AbstractFactory.h"
    #include "AbstractProductA.h"
    #include "AbstractProductB.h"
    #include "ConcreteFactory1.h"
    #include "ConcreteFactory2.h"
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    	AbstractFactory * fc = new ConcreteFactory1();
    	AbstractProductA * pa =  fc->createProductA();
    	AbstractProductB * pb = fc->createProductB();
    	pa->use();
    	pb->eat();
    	
    	AbstractFactory * fc2 = new ConcreteFactory2();
    	AbstractProductA * pa2 =  fc2->createProductA();
    	AbstractProductB * pb2 = fc2->createProductB();
    	pa2->use();
    	pb2->eat();
    }
    

      

    ///////////////////////////////////////////////////////////
    //  ConcreteFactory1.cpp
    //  Implementation of the Class ConcreteFactory1
    //  Created on:      02-十月-2014 15:04:11
    //  Original author: colin
    ///////////////////////////////////////////////////////////
    
    #include "ConcreteFactory1.h"
    #include "ProductA1.h"
    #include "ProductB1.h"
    AbstractProductA * ConcreteFactory1::createProductA(){
    	return new ProductA1();
    }
    
    
    AbstractProductB * ConcreteFactory1::createProductB(){
    	return new ProductB1();
    }
    

      

    ///////////////////////////////////////////////////////////
    //  ProductA1.cpp
    //  Implementation of the Class ProductA1
    //  Created on:      02-十月-2014 15:04:17
    //  Original author: colin
    ///////////////////////////////////////////////////////////
    
    #include "ProductA1.h"
    #include <iostream>
    using namespace std;
    void ProductA1::use(){
    	cout << "use Product A1" << endl;
    }

    4.建造者模式(Builder)

    将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    #include <iostream>
    #include "ConcreteBuilder.h"
    #include "Director.h"
    #include "Builder.h"
    #include "Product.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    	ConcreteBuilder * builder = new ConcreteBuilder();
    	Director  director;
    	director.setBuilder(builder);
    	Product * pd =  director.constuct();
    	pd->show();
    	
    	delete builder;
    	delete pd;
    	return 0;
    }
    

      

    ///////////////////////////////////////////////////////////
    //  ConcreteBuilder.cpp
    //  Implementation of the Class ConcreteBuilder
    //  Created on:      02-十月-2014 15:57:03
    //  Original author: colin
    ///////////////////////////////////////////////////////////
    
    #include "ConcreteBuilder.h"
    
    
    ConcreteBuilder::ConcreteBuilder(){
    
    }
    
    
    
    ConcreteBuilder::~ConcreteBuilder(){
    
    }
    
    void ConcreteBuilder::buildPartA(){
    	m_prod->setA("A Style "); //不同的建造者,可以实现不同产品的建造  
    }
    
    
    void ConcreteBuilder::buildPartB(){
    	m_prod->setB("B Style ");
    }
    
    
    void ConcreteBuilder::buildPartC(){
    	m_prod->setC("C style ");
    }
    
    ///////////////////////////////////////////////////////////
    //  Director.cpp
    //  Implementation of the Class Director
    //  Created on:      02-十月-2014 15:57:01
    //  Original author: colin
    ///////////////////////////////////////////////////////////
    
    #include "Director.h"
    
    Director::Director(){
    }
    
    Director::~Director(){
    }
    
    Product* Director::constuct(){
    	m_pbuilder->buildPartA();
    	m_pbuilder->buildPartB();
    	m_pbuilder->buildPartC();
    	
    	return m_pbuilder->getResult();
    }
    
    
    void Director::setBuilder(Builder* buider){
    	m_pbuilder = buider;
    }

    5.原型模式(Prototype)

    6.单例模式(Singleton)

    系统中期望这个对象只有一个。

    #include <iostream>
    #include "Singleton.h"
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    	Singleton * sg = Singleton::getInstance();
    	sg->singletonOperation();
    	
    	return 0;
    }
    

      

    ///////////////////////////////////////////////////////////
    //  Singleton.cpp
    //  Implementation of the Class Singleton
    //  Created on:      02-十月-2014 17:24:46
    //  Original author: colin
    ///////////////////////////////////////////////////////////
    
    #include "Singleton.h"
    #include <iostream>
    using namespace std;
    
    Singleton * Singleton::instance = NULL;
    Singleton::Singleton(){
    
    }
    
    Singleton::~Singleton(){
    	delete instance;
    }
    
    Singleton* Singleton::getInstance(){
    	if (instance == NULL)
    	{
    		instance = new Singleton();
    	}
    	
    	return  instance;
    }
    
    
    void Singleton::singletonOperation(){
    	cout << "singletonOperation" << endl;
    }
    

      

  • 相关阅读:
    SEO在网页制作中的应用
    日期控件选2016-01-01却变为2015-01-01问题
    IE8兼容placeholder的方案
    各种乱码,编码问题设置方法整理(UTF-8)
    JQuery简单实现图片轮播效果
    解决 jsp eclipse异常 【The import javax.servlet cannot be resolved】
    tomcat加载不了spring-webjar终极解决办法
    MyEclipse Web Project导入Eclipse Dynamic Web Project,无法部署到tomcat问 题
    2020-11-01助教一周总结(第九周)
    2020-10-25助教一周总结(第八周)
  • 原文地址:https://www.cnblogs.com/stonemjl/p/12582285.html
Copyright © 2011-2022 走看看