设计模式-----基于反射工厂模式

本文通过一个具体实例详细介绍了工厂模式的应用,展示了如何通过该模式降低代码耦合度,并提高程序的可维护性和可扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在学设计模式。在此记录每次学习


工厂模式是我们最常听到和用到的设计模式之一。之前也用到过,但是每次没有好好整理。

工厂模式的好处网上都很多解释。最主要减少程序耦合度,方便维护,扩展等等。

当一个程序越大,出现新的需求时,维护性,可扩展性就会显得越重要。


工厂模式:一般创建子类对象赋值基类或接口,但是无论是接口还是基类原理都是多态。继承在工厂模式也起了很重要作用,代码封装。


假设有一个公司要管理工资发放

公司里所有的人都是员工(Employee),应该有个Employee,里面应该有基本信息,和最重要工资计算方法

public abstract class Employee
{
        public int JobNumber { get; set; }
        public string Name { get; set; }

        public Employee(int number, string name)
        {
            this.JobNumber = number;
            this.Name = name;
        }
        public abstract double CalcularSalar();
}

有个项目经理,工资计算方式:5000(基本工资) + 项目奖金 。 项目经理也是员工,所以继承员工类
public class Manager : Employee
{
        private readonly double BASESALE = 0.0;
        private readonly double REWARDSALE = 0.0;

        public Manager(double baseSale, int number, string name)
            : base(number, name)
        {
            this.BASESALE = baseSale;
            this.REWARDSALE = 2000;
        }
        public override double CalcularSalar()
        {
            return this.BASESALE + this.REWARDSALE;
        }
}


也有程序员,工资计算方式:3000(基本奖金)。同理程序员也应该继承员工类

class Programer : Employee
 {
        private readonly double BASESALE = 0.0;
        public Programer(double baseSale, int number, string name)
            : base(number, name)
        {
            this.BASESALE = baseSale;
        }
        public override double CalcularSalar()
        {
            return this.BASESALE;
        }
 }

当然还有最重要工厂类

public class Factory
{
        public static object CreateObject(string assembly,string objName,params object[] args)
        {
            try
            {
                Assembly asm = Assembly.Load(assembly);
                if (asm == null) return null;

                string fullName = assembly + "." + objName;

                Type type = asm.GetType(fullName);
                Object obj = Activator.CreateInstance(type, args);

                if (obj == null) return null;
                return obj;
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog("[Factory].CreateObject(string objName)", ex.Message);
                return null;
            }
        }
 }

所有东西弄好,就到发工资

一般我们是

Manager manager = new Manager(5000, 2000, 1, "Jack");
manager.CalcularSalar();

Programer programer = new Programer(3000, 2, "Mike");
programer.CalcularSalar();

这样虽然是通俗易懂,但是不易维护,不易扩展,当出现新员工时,改动较大

工厂模式:

object[] paramers = new object[3];
paramers[0] = double.Parse(this.cmbBaseSale.Text);
paramers[1] = int.Parse(this.cmbJobNumber.Text);
paramers[2] = this.cmbName.Text;

Employee employee = Factory.CreateObject(GlobalValue.Model, this.cmbType.Text, paramers) as Employee;

MessageBox.Show(employee.CalcularSalar().ToString());


当公司发展需要一个测试人员,要程序员写一个测试人员发工资计算(基本工资 2500)

项目经理不可能把整个项目给程序员修改(万一程序员修改程序员发工资方式,每个月给自己+1000)

这时工厂模式发挥作用,项目经理只要告诉你有一个Employee的类,你去继承它实现测试人员类

很快可以写出

public class Tester:Employee
  {
        private readonly double BASESALE = 0.0;
        public Tester(double baseSale, int number, string name)
            : base(number, name)
        {
            this.BASESALE = baseSale;
        }
        public override double CalcularSalar()
        {
            return this.BASESALE;
        }
 }

只需要加入这个类,程序就能发测试人员工资


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值