五、工厂模式(Factory Method Pattern)

using System;




namespace FactoryPattern
{
    //工厂模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。
    //                           工厂方法使一个类的实例化延迟到其子类。
    //讲解说明:我们先回忆下,简单工厂模式(Simple Factory Pattern)


    /// <summary>
    ///在讲解简单工厂模式时我们用了商场收费的例子 
    /// </summary>
    public interface Ishoufei
    {
        double getMoney(double Rmb);
    }


    /// <summary>
    /// 正常收费
    /// </summary>
    class NormalCash : Ishoufei
    {
        public double getMoney(double Rmb)
        {
            return Rmb;
        }
    }


    class RebateCash : Ishoufei
    {
        /// <summary>
        /// 折扣率
        /// </summary>
        private double moneyRebate=1d;


        public RebateCash(double moneyRebate)
        {
            this.moneyRebate = moneyRebate;
        }


        public double getMoney(double Rmb)
        {
            return moneyRebate * Rmb;
        }
    }


    /// <summary>
    /// 简单工厂类
    /// </summary>
    public class SimpleFactory_Cash
    {
        public static Ishoufei CreateCash(string typ)
        {
            Ishoufei shf = null;
            switch (typ)
            {
                case "正常收费": shf = new NormalCash(); break;
                case "折扣收费": shf = new RebateCash(0.8); break;
            }
            return shf;
        }
    }


    //我们把上面的代码改为工厂模式
    /// <summary>
    /// 抽象工厂接口
    /// </summary>
    public interface IFactory
    {
        Ishoufei CreateShoufei();
    }


    /// <summary>
    /// 正常收费工厂
    /// </summary>
    public class NormalCashFactory : IFactory
    {
        public Ishoufei CreateShoufei()
        {
            return new NormalCash();
        }
    }


    /// <summary>
    /// 打折收费工厂
    /// </summary>
    public class RebateCashFactor : IFactory
    {
        /// <summary>
        /// 折扣率
        /// </summary>
        private double RebateRmb = 1d;


        public RebateCashFactor(double RebateRmb)
        {
            this.RebateRmb = RebateRmb;
        }


        public Ishoufei CreateShoufei()
        {
            return new RebateCash(RebateRmb);
        }


    }


    class Program
    {
        static void Main(string[] args)
        {
            //应收金额
            double YsRmb = 500d;
            //返回结果
            double resultRmb = 0d;
            //操作类
            Ishoufei shf = null;


            //简单工厂模式
            //shf = SimpleFactory_Cash.CreateCash("正常收费");


            //工厂模式
            IFactory Ifa = null;
            string typ = "正常收费";
            switch (typ)
            {
                case "正常收费":Ifa = new NormalCashFactory();break;
                case "打八折":Ifa = new RebateCashFactor(0.8d);break;
            }
            shf = Ifa.CreateShoufei();


            //结果输出
            resultRmb = shf.getMoney(YsRmb);
            Console.WriteLine(resultRmb);
            Console.ReadKey();


        }
    }


    //直接看代码的话,我们发现貌似 工厂模式比 简单工厂模式更加复杂。
    //增加新功能的话,简单工厂模式,需要增加一个新的子类,然后需要修改 简单工厂类。
    //                工厂模式,需要增加一个新的子类,在新增子类的工厂类,最后修改客户端。
    //我自己对这块也比较疑惑,有人说是因为 简单工厂,增加新功能时需要修改 简单工厂类,违反了开放封闭原则,
    //所以需要引入工厂模式。可是工厂模式同样需要修改客户端的代码,而且代码量比简单工厂模式大很多。
    //我个人认为,可能是如果程序的逻辑复杂度提高的化,如果使用简单工厂模式,会使得简单工厂类的复杂和臃肿程度增大,
    //不利于后期的维护。但是修改客户端代码也会遇到这个情况呀!有人说可以通过反射来解决客户端代码需要修改的问题,那
    //同样的是不是也可以通过反射的方式类解决'简单工厂类的臃肿'问题呢?? 求解!!!
    
}

猜你喜欢

转载自blog.csdn.net/xiangwenfly/article/details/54407422