zoukankan      html  css  js  c++  java
  • 1、简单工厂模式

    简单工厂模式:

    接口是用来封装隔离具体的实现的,目标就是不要让客户端知道封装体内部的具体实现。
    简单工厂的位置是位于封装体内的,所以简单工厂知道具体类的实现是没有关系的。
    对于客户端来说,只是知道了接口和简单工厂。

    优点:
    工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
    缺点:
    当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。同时,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。

    应用场景:

    如果想要完全封装隔离具体实现,让外部只能通过接口来操作封装体,则可以选用简单工厂。客户端通过工厂来获取相应的接口,而无需关心具体的实现。
    如果想要把对外创建对象的职责集中管理和控制,可以选用简单工厂。

    例(计算器):

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Operation
    {
        /// <summary>
        /// 运算类
        /// </summary>
        public class Operation
        {
            private double _numberA = 0;
            private double _numberB = 0;
            
            /// <summary>
            /// 数字A
            /// </summary>
            public double NumberA
            {
                get
                {
                    return _numberA;
                }
                set
                {
                    _numberA = value;
                }
            }
    
            /// <summary>
            /// 数字B
            /// </summary>
            public double NumberB
            {
                get
                {
                    return _numberB;
                }
                set
                {
                    _numberB = value;
                }
            }
    
            /// <summary>
            /// 得到运算结果
            /// </summary>
            /// <returns></returns>
            public virtual double getResult()
            {
                double result = 0; 
                return result;
            }
    
           
        }
    
        /// <summary>
        /// 加法类
        /// </summary>
        class OperationAdd : Operation
        {
            public override double getResult()
            {
                double result = 0; 
                result = NumberA + NumberB;
                return result;
            }
        }
    
        /// <summary>
        /// 减法类
        /// </summary>
        class OperationSub : Operation
        {
           public override double getResult()
            {
                double result = 0;
                result = NumberA - NumberB;
                return result;
            }
        }
    
        /// <summary>
        /// 乘法类
        /// </summary>
        class OperationMul : Operation
        {
            public override double getResult()
            {
                double result = 0;
                result = NumberA * NumberB;
                return result;
            }
        }
    
        /// <summary>
        /// 除法类
        /// </summary>
        class OperationDiv : Operation
        {
            public override double getResult()
            {
                double result = 0;
                if (NumberB==0)
                    throw new Exception("除数不能为0。");
                result = NumberA / NumberB;
                return result;
            }
        }
    
        /// <summary>
        /// 平方类
        /// </summary>
        class OperationSqr : Operation
        {
            public override double getResult()
            {
                double result = 0;
                result = NumberB * NumberB;
                return result;
            }
        }
    
        /// <summary>
        /// 平方根类
        /// </summary>
        class OperationSqrt : Operation
        {
            public override double getResult()
            {
                double result = 0;
                if (NumberB < 0)
                    throw new Exception("负数不能开平方根。");
                result = Math.Sqrt(NumberB);
                return result;
            }
        }
    
        /// <summary>
        /// 相反数类
        /// </summary>
        class OperationReverse : Operation
        {
            public override double getResult()
            {
                double result = 0;
                result = -NumberB;
                return result;
            }
        }
    
        /// <summary>
        /// 运算类工厂
        /// </summary>
        class OperationFactory
        {
            public static Operation createOperate(string operate)
            {
                Operation oper = null;
                switch (operate)
                {
                    case "+":
                        {
                            oper = new OperationAdd();
                            break;
                        }
                    case "-":
                        {
                            oper = new OperationSub();
                            break;
                        }
                    case "*":
                        {
                            oper = new OperationMul();
                            break;
                        }
                    case "/":
                        {
                            oper = new OperationDiv();
                            break;
                        }
                    case "sqr":
                        {
                            oper = new OperationSqr();
                            break;
                        }
                    case "sqrt":
                        {
                            oper = new OperationSqrt();
                            break;
                        }
                    case "+/-":
                        {
                            oper = new OperationReverse();
                            break;
                        }
                }
    
                return oper;
            }
        }
    }
    
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using OperationLibrary;
    
    namespace 计算器控制台
    {
    
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    Console.Write("请输入数字A:");
                    string strNumberA = Console.ReadLine();
                    Console.Write("请选择运算符号(+、-、*、/):");
                    string strOperate = Console.ReadLine();
                    Console.Write("请输入数字B:");
                    string strNumberB = Console.ReadLine();
                    string strResult = "";
    
                    Operation oper;
                    oper = OperationFactory.createOperate(strOperate);
                    oper.NumberA = Convert.ToDouble(strNumberA);
                    oper.NumberB = Convert.ToDouble(strNumberB);
                    strResult = oper.GetResult().ToString();
    
                    Console.WriteLine("结果是:" + strResult);
    
                    Console.ReadLine();
    
    
                }
                catch (Exception ex)
                {
                    Console.WriteLine("您的输入有错:" + ex.Message);
                }
            }
        }
    }
    
    

    例(商场促销)(代码略):

    当我们涉及到商场促销此类程序时,发现简单工厂模式可以解决正常收费,打折收费,返利收费等业务,甚至可以添加扩展达到一定积分领奖品等业务,但是简单工厂模式只是解决对象的创建问题。而且由于工厂本身包括了所有的收费方式,商场是可能是经常性更改打折额度和返利额度,每次维护和扩展收费方式都要改动这个工厂,以致代码需要重新编译部署,真的是很糟糕的处理方式,因此它不是最好的处理办法,面对算法的时常变动,应该采用更好的解决办法(策略模式)

  • 相关阅读:
    auth
    django缓存机制
    图片防盗链
    用户相关
    验证码
    单个容器部署django (docker + django + uwsgi)
    MySQL性能调优的10个方法
    数据库-外键
    数据库(存储引擎、字段类型、约束条件)
    数据库
  • 原文地址:https://www.cnblogs.com/study-hard-forever/p/13160933.html
Copyright © 2011-2022 走看看