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

    运行结果:

  • 相关阅读:
    完美串(区间dp)
    Brackets(区间dp)
    Eureka的高可用
    在Spring Boot中使用 @ConfigurationProperties 注解
    Spring Boot干货系列:(四)开发Web应用之Thymeleaf篇
    luogu3707 相关分析 (线段树)
    luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)
    bzoj4504 K个串 (优先队列+主席树)
    bzoj4336 骑士的旅行 (树链剖分+multiset)
    suoi37 清点更多船只 (卡空间线段树)
  • 原文地址:https://www.cnblogs.com/hpcpp/p/8404509.html
Copyright © 2011-2022 走看看