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;
    }

    运行结果:

  • 相关阅读:
    Go 函数方法
    rz上传文件乱码
    pip问题:ImportError: cannot import name main
    docker启动报错 docker: Error response from daemon: OCI runtime create failed: container_linux.go:348
    python遍历列表删除多个元素的坑
    python写入csv文件时的乱码问题
    python中的exec()函数和eval()函数
    tornado的IOLoop.instance()方法和IOLoop.current()方法区别
    安装mysql-python时报错
    python将科学计数法表示的数值的字符串转换成数值型数据
  • 原文地址:https://www.cnblogs.com/hpcpp/p/8404509.html
Copyright © 2011-2022 走看看