zoukankan      html  css  js  c++  java
  • 设计模式之工厂模式(Factory)

    设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式

    简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类

    代码如下:

    #include <stdio.h>
    #include <memory>
    #include <iostream>
    using namespace std;
    #define COREA 0
    #define COREB 1
    class Core
    {
    public:
    	virtual void show(){}
    };
    class CoreA:public Core
    {
    public:
    	virtual void show()
    	{
    		cout << "This is corea" <<endl;
    	}
    };
    class CoreB:public Core
    {
    public:
    	virtual void show()
    	{
    		cout << "This is coreb" <<endl;
    	}
    };
    
    class Factory
    {
    public:
    	Core* create(int producetype);
    	
    };
    
    Core* Factory::create(int producetype)
    {
    	switch(producetype)
    	{
    	case 0:
    		return new CoreA();
    		break;
    	case 1:
    		return new CoreB();
    		break;
    	default:
    		return NULL;			
    	}
    	
    	}
    int main()
    {
    	Factory * fa = new Factory();
    	Core* pcore = fa->create(0);
    	pcore->show();
    	return 0;
    }
    

    工厂方法模式原理:通过在客户调用不同的工厂类来实现同一类对象的创建。

    produce.h代码

    #ifndef PRODUCE_H
    #define PRODUCE_H
    #include <iostream>
    using namespace std;
    class Core
    {
    public:
    	virtual void show(){}
    };
    class CoreA:public Core
    {
    public:
    	virtual void show()
    	{
    		cout << "This is corea" <<endl;
    	}
    };
    class CoreB:public Core
    {
    public:
    	virtual void show()
    	{
    		cout << "This is coreb" <<endl;
    	}
    };
    #endif
    

     factory.h代码

    #ifndef FACOTRY_H
    #define FACOTRY_H
    #include <iostream>
    #include "produce.h"
    using namespace std;
    
    class Factory
    {
    public:
    	virtual Core* create();
    	
    };
    class FactoryCoreA:public Factory
    {
    	virtual Core* create();
    };
    class FactoryCoreB:public Factory
    {
    	virtual Core* create();
    };
    
    #endif
    

     factory.cpp代码

    #include <iostream>
    #include "factory.h"
    using namespace std;
    Core* Factory::create()
    {
    	return NULL;
    }
    Core* FactoryCoreA::create()
    {
    	return new CoreA();
    }
    Core* FactoryCoreB::create()
    {
    	return new CoreB();
    }
    

     客户main.cpp代码

    #include <stdio.h>
    #include <memory>
    #include <iostream>
    #include "factory.h"
    #include "produce.h"
    using namespace std;
    #define COREA 0
    #define COREB 1
    
    int main()
    {
    	Factory * fa = new FactoryCoreA();
    	Core* pcore = fa->create();
    	pcore->show();
    	return 0;
    }
    

     抽象工厂原理:抽象工厂可以创建一系列的产品,缺点如果是增加产品种类,需要重新修改抽象工厂接口和实现

    部分代码如下

    factory.cpp

    #include <iostream>
    #include "factory.h"
    #include "Board.h"
    using namespace std;
    Core* Factory::createcore()
    {
    	return NULL;
    }
    
    Core* FactorySeriaA::createcore()
    {
    	return new CoreA();
    }
    Core* FactorySeriaB::createcore()
    {
    	return new CoreB();
    }
    
    Board* Factory::createboard()
    {
    	return NULL;
    }
    Board* FactorySeriaA::createboard()
    {
    	return new BoardA();
    }
    Board* FactorySeriaB::createboard()
    {
    	return new BoardB();
    }
    

     fatory.h

    #ifndef FACOTRY_H
    #define FACOTRY_H
    #include <iostream>
    #include "produce.h"
    #include "Board.h"
    using namespace std;
    
    class Factory
    {
    public:
    	virtual Core* createcore();
    	virtual Board* createboard();
    	
    };
    class FactorySeriaA:public Factory
    {
    	virtual Core* createcore();
    	virtual Board* createboard();
    };
    class FactorySeriaB:public Factory
    {
    	virtual Core* createcore();
    	virtual Board* createboard();
    };
    
    #endif
    

     新增的产品种类类Board.h

    #ifndef BOARD_H
    #define BOARD_H
    #include <iostream>
    using namespace std;
    class Board
    {
    public:
    	virtual void show(){}
    };
    class BoardA:public Board
    {
    public:
    	virtual void show()
    	{
    		cout << "This is boarda" <<endl;
    	}
    };
    class BoardB:public Board
    {
    public:
    	virtual void show()
    	{
    		cout << "This is boardb" <<endl;
    	}
    };
    #endif
    
  • 相关阅读:
    强制位与冒险位
    完美图解教程 Linux环境VNC服务安装、配置与使用
    Linux 最常用命令
    return 与 exit()的区别return退出本函数,exit()退出整个程序
    Linux标准目录配置(转自鸟哥)
    Hadoop C访问
    Shell学习总结
    为 Linux 应用程序编写 DLL(在仅仅只会编写插件的时候为什么要编写整个应用程序?)
    SteveY对Amazon和Google平台的长篇大论
    gcc环境变量基础
  • 原文地址:https://www.cnblogs.com/liuweilinlin/p/3203165.html
Copyright © 2011-2022 走看看