zoukankan      html  css  js  c++  java
  • 设计模式之抽象工程模式Abstract Factory Pattern()C++实现

    抽象工厂模式(Abstract Factory Pattern):是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

    意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

    主要解决:主要解决接口选择的问题。

    何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

    代码

    //-------------------------------------------------------
    // 设计模式:抽象工程模式
    //-------------------------------------------------------
    #include "stdafx.h"
    #include<iostream>
    #include <cstring>
    using namespace std;
    //------------------------------------------------------------------------------------------
    class Shape
    {
    public:
    	void virtual draw()=0;
    };
    
    class Rec : public Shape
    {
    public:
    	void draw()
    	{
    		cout << "Rec.draw()"<< endl;
    	}
    };
    
    class Square : public Shape
    {
    public:
    	void draw()
    	{
    		cout << "Square.draw()"<< endl;
    	}
    };
    
    class Circle : public Shape
    {
    public:
    	void draw()
    	{
    		cout << "Circle.draw()"<< endl;
    	}
    };
    //------------------------------------------------------------------------------------------
    class Color
    {
    public:
    	void virtual fill() = 0;
    };
    
    class Red :public Color
    {
    public:
    	void fill()
    	{
    		cout << "Color.Red()" << endl;
    	}
    };
    
    class Green :public Color
    {
    public:
    	void fill()
    	{
    		cout << "Color.Green()" << endl;
    	}
    };
    class Blue :public Color
    {
    public:
    	void fill()
    	{
    		cout << "Color.Blue()" << endl;
    	}
    };
    //-----------------------------------------------------------------------------
    class AbstractFactory
    {
    public:
    	virtual Color* getColor(string color)=0;
    	virtual Shape* getShape(string shape)=0;
    };
    
    class ShapeFactory : public AbstractFactory
    {
    public:
    	Shape* getShape(string shape)
    	{
    		if (shape.empty())
    		{
    			return NULL;
    		}
    		if (shape.compare("Rec") == 0)
    		{
    			return new Rec();
    		}
    		if (shape.compare("Square") == 0)
    		{
    			return new Square();
    		}
    		if (shape.compare("Circle") == 0)
    		{
    			return new Circle();
    		}
    		return NULL;
    	}
    	Color* getColor(string color)
    	{
    		return NULL;
    	}
    };
    
    class ColorFactory : public AbstractFactory
    {
    public:
    	Color* getColor(string color)
    	{
    		if (color.empty())
    		{
    			return NULL;
    		}
    		if (color.compare("Red") == 0)
    		{
    			return new Red();
    		}
    		if (color.compare("Green") == 0)
    		{
    			return new Green();
    		}
    		if (color.compare("Blue") == 0)
    		{
    			return new Blue();
    		}
    		return NULL;
    	}
    	Shape* getShape(string shape)
    	{
    		return NULL;
    	}
    };
    
    class FactoryProducer
    {
    public:
    	AbstractFactory* getFactory(string choice)
    	{
    		if (choice.compare("SHAPE") == 0)
    		{
    			return new ShapeFactory();
    		}else if (choice.compare("Color") == 0)
    		{
    			return new ColorFactory();
    		}
    		return NULL;
    	}
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	FactoryProducer factoryProducer;
    	AbstractFactory* shapeFactory = factoryProducer.getFactory("SHAPE");
    
    	Shape *shape1 = shapeFactory->getShape("Circle");
    	shape1->draw();
    
    	Shape *shape2 = shapeFactory->getShape("Square");
    	shape2->draw();
    
    	Shape *shape3 = shapeFactory->getShape("Rec");
    	shape3->draw();
    
    	//---------------------------------------------------------------------------
    	AbstractFactory *colorFactory = factoryProducer.getFactory("Color");
    
    	Color* color1 = colorFactory->getColor("Red");
    	color1->fill();
    
    	Color* color2 = colorFactory->getColor("Blue");
    	color2->fill();
    
    	Color* color3 = colorFactory->getColor("Green");
    	color3->fill();
    
    	system("PAUSE");
    	return 0;
    }
    


    生命不止,奋斗不息!
  • 相关阅读:
    【Silverlight】Bing Maps系列文章汇总
    《MEF程序设计指南》博文汇总
    Flash中各种图形的绘制
    Bing Maps开发扩展二:基于Oracle Spatial的空间数据分析
    Bing Maps开发扩展三:Bing Maps中渲染ESRI SHP空间数据
    Spring Cloud Gateway
    Spring Cloud Gateway 整合 nacos
    Spring Cloud Gateway 断言(Predicate) (hoxton 版本)
    Python和Node.js支持尾递归吗?
    用OpenCv来做人脸识别
  • 原文地址:https://www.cnblogs.com/huzongzhe/p/6735201.html
Copyright © 2011-2022 走看看