简单工厂模式

来源:互联网 发布:淘宝拔草少年真货假货 编辑:程序博客网 时间:2024/06/14 23:56

 简单工厂模式说明:
当需要创建类的实例时却不知道到底应该创建哪一个类时,选择用简单工厂模式。专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。其实质是有一个工厂累根据传入的参量,动态决定应创建出哪一个累的实例。

实例说明

1.薪资管理系统
假定公司薪资分为技术人员(月薪),市场营销人员(底薪+提成),经理(年薪+股份)三种运算算法,如果我们把三种运算写在
一个类中,这样假如以后要增加兼职人员(时新)的算法,这样就必须得更改这个类,导致以前三种算法暴露。所以应该把每一种
运算算法分离开来,这样以后需要修改某一算法或者新添加一种算法,都只修改一个子类或者新添加一个类和简单工厂类,不会影
响其他的类。实例化时根据人员岗位动态创建。在此用简单工厂模式非常的合适。具体见代码及说明。

 

    /// <summary>
    /// 抽象父类:定义一个方法返回薪资值
    /// </summary>
    public abstract class SalaryManage
    {
        /// <summary>
        /// 返回薪资
        /// </summary>
        public abstract string GetSalary();
    }

 

    /// <summary>
    /// 技术人员薪资
    /// </summary>
    public class SalaryTech:SalaryManage
    {
        public override string GetSalary()
        {
            return "我是技术人员,我的薪资是月薪";
        }
    }

 

    /// <summary>
    /// 市场营销人员薪资
    /// </summary>
    public class SalaryMarket:SalaryManage
    {
        public override string GetSalary()
        {
            return "我是市场营销人员,我的薪资是底薪+提成";
        }
    }

    /// <summary>
    /// 经理薪资
    /// </summary>
    public class SalaryManager:SalaryManage
    {
        public override string GetSalary()
        {
            return "我是经理,我的薪资是年薪+股份";
        }
    }

 

    /// <summary>
    /// 简单工厂类:动态决定创建哪个类的实例
    /// </summary>
    public class SalaryFactory
    {
        public static SalaryManage CreateSalaryManage(string type)
        {
            SalaryManage sal = null;
            switch (type)
            {
                case "技术人员":
                    sal = new SalaryTech();
                    break;
                case "市场营销人员":
                    sal = new SalaryMarket();
                    break;
                case "经理":
                    sal = new SalaryManager();
                    break;
            }
            return sal;
        }
    }

 

调用:

SalaryManage sal;
 sal = SalaryFactory.CreateSalaryManage("经理");
Console.WriteLine(sal.GetSalary());

 

假如现在要新增加一个兼职人员(时新),此时只需要新添加一个兼职人员的类,同时修改简单工厂类即可。

    /// <summary>
    /// 兼职人员薪资
    /// </summary>
    public class SalaryParttime:SalaryManage
    {
        public override string GetSalary()
        {
            return "我是兼职人员,我的薪资是时新";
        }
    }

 

    /// <summary>
    /// 简单工厂类
    /// </summary>
    public class SalaryFactory
    {
        public static SalaryManage CreateSalaryManage(string type)
        {
            SalaryManage sal = null;
            switch (type)
            {
                case "技术人员":
                    sal = new SalaryTech();
                    break;
                case "市场营销人员":
                    sal = new SalaryMarket();
                    break;
                case "经理":
                    sal = new SalaryManager();
                    break;
                case "兼职人员":
                    sal = new SalaryParttime();
                    break;
            }
            return sal;
        }
    }

原创粉丝点击