首页 > 其他 > 详细

设计模式-抽象工厂模式

时间:2014-07-11 22:57:33      阅读:372      评论:0      收藏:0      [点我收藏+]

概述

在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式。

意图

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AbstractFactoryPattern
{
    class Program
    {
        static void Main(string[] args)
        {
            //得到国家的实例
            AbstractFactory af = AbstractFactory.GetInstance();

            //中国人基本工资
            IBonus cs = af.CreateBonus();

            //中国个人所得税
            ITax ct = af.CreateTax();

            //工资
            double salary ;

            salary = Constant.BASE_SALARY + cs.Calculate() - ct.Calculate();

            Console.WriteLine("Chinese salary is : {0}",salary);

            Console.ReadLine();
        }
    }

    /// <summary>
    /// 公共常量
    /// </summary>
    public class Constant
    {
        public static double BASE_SALARY = 4000;
        public static string BASE_FACTORYNAME = ConfigurationManager.AppSettings["factoryName"].ToString();
    }

    #region 接口和抽象类
    /// <summary>
    /// 计算个人奖金接口
    /// </summary>
    public interface IBonus
    {
        double Calculate();
    }

    /// <summary>
    /// 计算个人所得税接口
    /// </summary>
    public interface ITax
    {
        double Calculate();
    }

    public abstract class AbstractFactory
    {
        public static AbstractFactory GetInstance()
        {
            string factoryName = Constant.BASE_FACTORYNAME;

            AbstractFactory instance;
            if (factoryName == "ChineseFactory")
            {
                instance = new ChineseFactory();
            }
            else if (factoryName == "AmericanFactory")
            {
                instance = new AmericanFactory();
            }
            else
                return null;

            return instance;

        }

        public abstract IBonus CreateBonus();

        public abstract ITax CreateTax();
    }
    #endregion

    #region 计算公式
    /// <summary>
    /// 得到中国计算公式的实例
    /// </summary>
    public class ChineseFactory:AbstractFactory
    {
        public override IBonus CreateBonus()
        {
            return new ChineseBonus();
        }

        public override ITax CreateTax()
        {
            return new ChineseTax();
        }
    }

    /// <summary>
    /// 得到美国计算公式的实例
    /// </summary>
    public class AmericanFactory : AbstractFactory
    {
        public override IBonus CreateBonus()
        {
            return new AmericanBonus();
        }

        public override ITax CreateTax()
        {
            return new AmericanTax();
        }
    }

    /// <summary>
    /// 计算中国个人奖金
    /// </summary>
    public class ChineseBonus:IBonus
    {
        public double Calculate()
        {
            return Constant.BASE_SALARY * 0.1;
        }
    }

    /// <summary>
    /// 计算美国个人奖金
    /// </summary>
    public class AmericanBonus : IBonus
    {
        public double Calculate()
        {
            return Constant.BASE_SALARY * 0.15;
        }
    }

    /// <summary>
    /// 计算中国个人所得税
    /// </summary>
    public class ChineseTax:ITax
    {
        public double Calculate()
        {
            return (Constant.BASE_SALARY + Constant.BASE_SALARY * 0.1) * 0.4;
        }
    }

    /// <summary>
    /// 计算美国个人所得税
    /// </summary>
    public class AmericanTax : ITax
    {
        public double Calculate()
        {
            return Constant.BASE_SALARY * 0.4;
        }
    }
    #endregion
}

在原文中使用了反射,来将抽象工厂类(AbstractFactory)中的具体工厂名称给替换了,记得之前看过一篇文章,有一种方法可以达到反射的效果,当时没仔细看,写这篇文章的时候也找不到了,所以就没有写出来,希望之后可以找到,然后再更新。

原文地址和第一篇一样,有需要的可以过去看看!

设计模式-抽象工厂模式,布布扣,bubuko.com

设计模式-抽象工厂模式

原文:http://www.cnblogs.com/wym1140679188/p/3833045.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!