简单工厂模式和工厂方法模式
一:简单工厂模式
1,概念
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。顾名思义工厂就是生产东西的,有原料(参数),模子(对象)就能生产出很多个具有相同功能的对象啦。
2,uml图class Program { static void Main(string[] args) { Operate oper; //创建Operate类的oper类 oper = OperationFactoty.createOperate("+"); //运用简单工厂判断实力化的对象 oper.NumberA = 1; //赋值 oper.NumberB = 2; double result = oper.GetResult(); Console.WriteLine(result); //显示运算结果 } } //简单工厂,通过判断参数,实例化相应的对象 public class OperationFactoty { public static Operate createOperate(string operate) { Operate oper = null; switch (operate){ } return oper; } } //定义一个运算基类,包含GetResult虚方法 public class Operate //定义一个运算类 { private double numberA=0; //运算前的数 private double numberB=0; //运算后的数 public double NumberA{ } public double NumberB{ } public virtual double GetResult()//返回运算后结果的方法 { return result; //返回结果 } } // 运算类的四个继承类,分别实现加减乘除四个运算 public class NumberAdd : Operate //加运算 { public override double GetResult()//实现基类中的虚方法 { double result = NumberA + NumberB; return result; } } public class NumberSub:Operate //减运算 { public override double GetResult(){ } } public class NumberMul:Operate //乘运算 { public override double GetResult(){ } } public class NumberDiv:Operate //除运算 { public override double GetResult(){ } }
4,总结
简单工厂模式,我把它理解为一个模子,根据外界给定的原料,在加上自身封装好的判断,生产出不同类型的相应的产品、对象。
class Program { static void Main(string[] args) { IFactory factory = new UndergraduateFactory(); //由接口创建新的学雷锋大学生 LeiFeng student = factory.CreateLeifeng(); //实例化 student.BuyRice(); student.Sweep(); student.Wash(); } } //雷锋类,定义了一些功能 class LeiFeng { public void Sweep(){ } //擦桌子 public void Wash(){ } //洗衣服 public void BuyRice(){ } //买米 } //学雷锋的大学生 class UnderGraduate : LeiFeng{ } //社区志愿者 class Volunteer : LeiFeng{ } //雷锋工厂 interface IFactory //定义一个接口,实现创建雷锋类的功能 { LeiFeng CreateLeifeng(); } class UndergraduateFactory : IFactory//学雷锋大学生工厂 { public LeiFeng CreateLeiFeng() { return new UnderGraduate(); } } class VolunteerFactory : IFactory//社区志愿者工厂 { public LeiFeng CreateLeiFeng() { return new Volunteer(); } }
class Program { static void Main(string[] args) { LeiFeng studentA = SimpleFactory.CreateLeiFeng("学雷锋的大学生");//用简单工厂创建并实例化学雷锋的大学生 studentA.BuyRice(); LeiFeng studentB = SimpleFactory.CreateLeiFeng("社区志愿者");//用简单工厂创建实例化社区志愿者 studentB.BuyRice(); } } //雷锋类,定义了一些功能 class LeiFeng { public void Sweep(){ } //擦桌子 public void Wash(){ } //洗衣服 public void BuyRice(){ } //买米 } //简单工厂类 class SimpleFactory { public static LeiFeng CreateLeiFeng(string type) { LeiFeng result = null; switch (type) //判断选择要创建对象的类型 { case "学雷锋的大学生": result = new UnderGraduate(); break; case "社区志愿者": result = new UnderGraduate(); break; } return result; } }
工厂方法模型中,“工厂”创建的是还没有分化好的对象,其中没有逻辑判断相比于简单工厂模式,基类工厂去实现接口,子工厂去实现判断并能生产出相应功能的对象。
专门定义一个工厂类负责创建其他类的实例,最大的优点在于工厂类中包含了必要的逻辑,根据客户需要的条件动态实例化相关的类
创建对象的接口,让子类去决定具体实例化的对象,把简单的内部逻辑判断移到了客户端代码。工厂方法克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。