zoukankan      html  css  js  c++  java
  • 抽象工厂模式C++实现

    参考:http://www.runoob.com/design-pattern/abstract-factory-pattern.html

    C++代码实现:(为了简单演示,这些类的定义都在一个头文件中,具体使用的时候,应该分开文件存放)

    #include <iostream>
    using namespace std;
    
    class Shape{
    public:
        virtual void draw() = 0;
    };
    
    class Rectangle : public Shape{
    public:
        void draw(){
            cout << "Inside Rectangle::draw() method." << endl;
        }
    };
    
    class Square : public Shape{
    public:
        void draw(){
            cout << "Inside Square::draw() method." << endl;
        }
    };
    
    class Circle : public Shape{
    public:
        void draw(){
            cout << "Inside Circle::draw() method." << endl;
        }
    };
    
    class Color{
    public:
        virtual void fill() = 0;
    };
    
    class Red : public Color{
    public:
        void fill(){
            cout << "Inside Red:fill() methon." << endl;
        }
    };
    
    class Green : public Color{
    public:
        void fill(){
            cout << "Inside Green:fill() methon." << endl;
        }
    };
    
    class Blue : public Color{
    public:
        void fill(){
            cout << "Inside Blue:fill() methon." << endl;
        }
    };
    
    class AbstractFactory{
    public:
        virtual Color* getColor(string color) = 0;
        virtual Shape* getShape(string shape) = 0;
    };
    
    class ShapeFactory : public AbstractFactory{
    public:
        Shape* getShape(string shapeType){
            if (shapeType.empty())
            {
                return NULL;
            }
    
            if (shapeType == "CIRCLE")
            {
                return new Circle();
            }
            else if (shapeType == "RECTANGLE")
            {
                return new Rectangle();
            }
            else if (shapeType == "SQUARE")
            {
                return new Square();
            }
            return NULL;
        }
    
        Color* getColor(string color){
            return NULL;
        }
    };
    
    class ColorFactory : public AbstractFactory{
    public:
        Shape* getShape(string shapeType){
            return NULL;
        }
    
        Color* getColor(string color){
            if (color.empty())
            {
                return NULL;
            }
            else if (color == "RED")
            {
                return new Red();
            }
            else if (color == "Green")
            {
                return new Green();
            }
            else if (color == "BLUE")
            {
                return new Blue();
            }
            return NULL;
        }
    };
    
    class FactoryProducer
    {
    public:
        static AbstractFactory* getFactory(string choice){
            if (choice == "SHAPE")
            {
                return new ShapeFactory();
            }
            else if (choice == "COLOR")
            {
                return new ColorFactory();
            }
            return NULL;
        }
    };

    测试:

    #include "AbstractFactory.h"
    
    int main()
    {
        //获取形状工厂
        AbstractFactory* shapeFactory = FactoryProducer::getFactory("SHAPE");
    
        //获取形状为Circle的对象
        Shape* shape1 = shapeFactory->getShape("CIRCLE");
    
        //调用Circle的draw方法
        shape1->draw();
    
        //获取形状为Rectangle的对象
        Shape *shape2 = shapeFactory->getShape("RECTANGLE");
    
        //调用Rectangle的draw方法
        shape2->draw();
    
        //获取形状为Square的对象
        Shape *shape3 = shapeFactory->getShape("SQUARE");
    
        //调用Square的draw方法
        shape3->draw();
    
        //获取颜色工厂
        AbstractFactory* colorFactory = FactoryProducer::getFactory("COLOR");
    
        //获取颜色为Red的对象
        Color *color1 = colorFactory->getColor("RED");
    
        //调用Green的fill方法
        color1->fill();
    
        //获取颜色为Green的对象
        Color *color2 = colorFactory->getColor("Green");
    
        //调用Red的fill方法
        color2->fill();
    
        //获取颜色为Blue的对象
        Color *color3 = colorFactory->getColor("BLUE");
    
        //调用Blue的fill方法
        color3->fill();
    
        getchar();
        return 0;
    }

    运行结果:

  • 相关阅读:
    mysql报错排查总结
    java设计模式--外观模式
    java设计模式--策略模式
    java设计模式--策略模式
    java设计模式--简单工厂
    java设计模式--简单工厂
    国外有哪些比较好的IT社区
    使用jmeter进行性能测试-Jmeter教程及技巧汇总 (转)
    Fiddler环境配置教程
    Fiddler+Jmeter+断言详细教程
  • 原文地址:https://www.cnblogs.com/hpcpp/p/8404509.html
Copyright © 2011-2022 走看看