• [设计模式]简单工厂模式


    概念:

    有一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例

    角色和职责:

    工厂类:

    简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被客户端直接调用,创建所需要的对象。

    抽象产品类:

    简单工厂所创建的所有对象的父类,它负责描述所有实例的公共接口。

    具体产品类:

    是简单工厂模式创建目标,所有创建的对象都是充当这个角色的某一个具体的实例。

    优点:

    工厂类包含了必要了逻辑判断,根据外部传入的信息决定创建哪一个具体产品对象,通过使用工厂可以直接创建具体的产品对象,负责消费即可,无需考虑这些对象是如何组织和创建的,明确了各自的职责和权利。

    缺点:

    由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑都集中到了一个类中,此类将会较为复杂,它需要创建的对象需要事先考虑到,如果需要添加新的类,就只能需要改动工厂类的代码了。

    UML:


    Demo:

    namespace SampleFactory
    {
        public class SimpleFactory
        {
            /// <summary>
            /// opertaion enum
            /// </summary>
            public enum OperationEnum
            { 
                None  = 0,
                Add,
                Sub,
                Mul,
                Div
            }
    
            /// <summary>
            /// create operation by factory
            /// </summary>
            /// <param name="operation"></param>
            /// <returns></returns>
            public static Operation Create(OperationEnum operation)
            {
                Operation oper = null;
    
                switch(operation)
                {
                    case OperationEnum.Add:
                        oper = new Add();
                        break;
                    case OperationEnum.Sub:
                        oper = new Sub();
                        break;
                    case OperationEnum.Mul:
                        oper = new Mul();
                        break;
                    case OperationEnum.Div:
                        oper = new Div();
                        break;
                }
    
                return oper;
            }
        }
    
        /// <summary>
        /// operation interface
        /// </summary>
        public class Operation
        {
            public double NumA { get; set; }
            public double NumB { get; set; }
    
            public virtual double GetResult()
            {
                double result = 0;
                return result;
            }
        }
    
        /// <summary>
        /// add
        /// </summary>
        public class Add : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumA + NumB;
                return result;
            }
        }
    
        /// <summary>
        /// sub
        /// </summary>
        public class Sub : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumA - NumB;
                return result;
            }
        }
    
        /// <summary>
        /// mul
        /// </summary>
        public class Mul : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumA * NumB;
                return result;
            }
        }
    
        /// <summary>
        /// div
        /// </summary>
        public class Div : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                result = NumA / NumB;
                return result;
            }
        }
    }
    
    // Client
    class Program
        {
            static void Main(string[] args)
            {
                // use factory create object to do something
                Operation operation = SimpleFactory.Create(SimpleFactory.OperationEnum.Add);
                operation.NumA = 1;
                operation.NumB = 2;
                Console.WriteLine("result:" +operation.GetResult());
    
                operation = SimpleFactory.Create(SimpleFactory.OperationEnum.Sub);
                operation.NumA = 1;
                operation.NumB = 2;
                Console.WriteLine("result:" + operation.GetResult());
    
                operation = SimpleFactory.Create(SimpleFactory.OperationEnum.Mul);
                operation.NumA = 1;
                operation.NumB = 2;
                Console.WriteLine("result:" + operation.GetResult());
    
                operation = SimpleFactory.Create(SimpleFactory.OperationEnum.Div);
                operation.NumA = 1;
                operation.NumB = 2;
                Console.WriteLine("result:" + operation.GetResult());
            }
        }
    C#
    enum OperationEnum
    {
        None = 0,
        eAdd,
        eSub,
        eMul,
        eDiv
    };
    
    // define operation interface
    class Operation
    {
    public:
    
        void SetNumA(double num);
        void SetNumB(double num);
    
        double GetNumA();
        double GetNumB();
    
        virtual double GetResult()
        {
            return 0;
        };
    
        double NumA;
        double NumB;
    };
    
    
    // add
    class Add : public Operation
    {
    public:
        double GetResult()
        {
            return NumA + NumB;
        };
    };
    
    // sub
    class Sub : public Operation
    {
    public:
        double GetResult()
        {
            return NumA - NumB;
        };
    };
    
    // mul
    class Mul :public Operation
    {
    public:
        double GetResult()
        {
            return NumA * NumB;
        };
    };
    
    // div
    class Div :public Operation
    {
    public:
        double GetResult()
        {
            return NumA / NumB;
        };
    };
    
    // the simple factory
    class SimpleFactory
    {
    public:
        static Operation* Create(OperationEnum opEnum)
        {
            Operation* operation;
            switch (opEnum)
            {
            case eAdd:
                operation = new Add();
                break;
            case eSub:
                operation = new Sub();
                break;
            case eMul:
                operation = new Mul();
                break;
            case eDiv:
                operation = new Div();
                break;
            default:
                break;
            }
            return operation;
        }
    };
    
    // Client
    Operation* operation = SimpleFactory::Create(eAdd);
        operation->NumA = 1;
        operation->NumB = 2;
        cout << "result:" << operation->GetResult() << endl;
        delete operation;
        operation = NULL;
    
        operation = SimpleFactory::Create(eSub);
        operation->NumA = 1;
        operation->NumB = 2;
        cout << "result:" << operation->GetResult() << endl;
        delete operation;
        operation = NULL;
    
        operation = SimpleFactory::Create(eMul);
        operation->NumA = 1;
        operation->NumB = 2;
        cout << "result:" << operation->GetResult() << endl;
        delete operation;
        operation = NULL;
    
        operation = SimpleFactory::Create(eDiv);
        operation->NumA = 1;
        operation->NumB = 2;
        cout << "result:" << operation->GetResult() << endl;
        delete operation;
        operation = NULL;
    C++
    人生就是一局不能Again的DOTA
  • 相关阅读:
    阿里云Centos7安装和启动nginx
    mysql安装配置、主从复制配置详解
    php 文件大小计算转换
    tp5.0 生成二维码 + 合并海报图
    iTerm2 + Oh My Zsh
    linux 安装 卸载 命令
    php两个时间日期相隔的天数,时,分,秒.
    PhpStorm下载 + 破解
    php 地区三级联动
    PhpSpreadsheet 引入类库 导出 excel
  • 原文地址:https://www.cnblogs.com/hellenism/p/3603216.html
Copyright © 2020-2023  润新知