• 【C++设计模式一】C++简单工厂模式


    (1)定义

    定义一个简单工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

    (2)结构

    简单工厂模式有以下的结构:

    • 工厂(Factory):根据客户提供的具体产品类的参数,创建具体产品实例;
    • 抽象产品(AbstractProduct):具体产品类的基类,包含创建产品的公共方法;
    • 具体产品(ConcreteProduct):抽象产品的派生类,包含具体产品特有的实现方法,是简单工厂模式的创建目标。

    (3)实例

    SimpleFactory.h

    #ifndef SIMPLEFACTORY_H
    #define SIMPLEFACTORY_H
    #include <iostream>
    #include <string>
    
    //抽象产品类AbstractProduct(并非真正意义上的抽象类,含有纯虚函数才是抽象类)
    class AbstractSportProduct
    {
    public:
    	AbstractSportProduct(){}
    	~AbstractSportProduct(){}
    
    	//虚函数
    	virtual void printName(){}
    	virtual void play(){}
    };
    
    //具体产品类Basketball
    class Basketball :public AbstractSportProduct
    {
    public:
    	Basketball(){}
    	~Basketball(){}
    
    	//具体实现方法
    	void printName();	
    	void play();
    };
    
    //具体产品类Football
    class Football :public AbstractSportProduct
    {
    public:
    	Football(){}
    	~Football(){}
    
    	//具体实现方法
    	void printName();
    	void play();
    };
    
    //工厂类
    class Factory
    {
    public:
    	Factory(){}
    	~Factory(){}
    
    	AbstractSportProduct *getSportProduct(std::string productName);
    };
    
    #endif // TSIMPLEFACTORY_H
    

    SimpleFactory.cpp

    #include "SimpleFactory.h"
    
    //Basketball方法
    void Basketball::printName(){
    	printf("Basketball
    ");
    }
    void Basketball::play(){
    	printf("play Basketball
    ");
    }
    
    //Football方法
    void Football::printName(){
    	printf("Football
    ");
    }
    void Football::play(){
    	printf("play Football
    ");
    }
    
    //工厂方法
    AbstractSportProduct *Factory::getSportProduct(std::string productName)
    {
    	AbstractSportProduct *pro = NULL;
    	if (productName == "Basketball")
    	{
    		pro = new Basketball();
    	}
    	else if (productName == "Football")
    	{
    		pro = new Football();
    	}
    	return pro;
    }
    

    main.cpp

    #include "SimpleFactory.h"
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Factory *fac = new Factory();
    	AbstractSportProduct *product = NULL;
        
    	product = fac->getSportProduct("Basketball");
    	product->printName();
    	product->play();
    
    	product = fac->getSportProduct("Football");
    	product->printName();
    	product->play();
        
        return 0;
    }
    

    输出结果:

    (4)总结

    优点:

    • 工厂类提供创建具体产品的方法,并包含一定判断逻辑,客户不必参与产品的创建过程;
    • 客户只需要知道对应产品的参数即可,参数一般简单好记,如数字、字符或者字符串等。

    缺点:

    • 在扩展功能时,需要增加具体的产品类和修改工厂类,所以违背了开闭原则(对扩展开放,对修改关闭)。

    (z)源码路径

    gitee: https://gitee.com/CogenCG/DesignMode

  • 相关阅读:
    z470 装黑苹果 10.92
    Ubuntu 14.04安装Chromium浏览器并添加Flash插件Pepper Flash Player
    Jira 6.0.3 安装与破解
    Scrumworks乱码
    升级 CentOS git 1.7.1 到 1.7.12
    函数细说及匿名函数
    第四章—变量,作用域和内存问题(三)
    第四章—变量,作用域和内存问题(二)
    CSS-DOM的小知识(一)
    第三章——基本概念(三)
  • 原文地址:https://www.cnblogs.com/lcgbk/p/13819263.html
Copyright © 2020-2023  润新知