Simple Factory简单工厂模式

xiaoxiao2021-02-28  58

Simple Factory模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个公共的父类和公共的方法 当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。 同时,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。

namespace SimplyFactory { class Program { public static void Main() { ProductSimpleFactory ps = new ProductSimpleFactory(); Product pro1 = ps.CreateProduct("TVA"); pro1.Create(); Product pro2 = ps.CreateProduct("TVB"); pro2.Create(); Product pro3 = ps.CreateProduct("TVC"); pro3.Create(); Console.ReadKey(); } } //简单工厂模式:工厂类Creator:创建产品对象、产品抽象类Product、具体产品类ConcreteProduct public abstract class Product//产品抽象类 { public abstract void Create(); } public class TVA : Product { public override void Create() { Console.WriteLine("Create a Product of TVA"); } } public class TVB : Product//具体产品 { public override void Create() { Console.WriteLine("Create a Product of TVB"); } } public class TVC : Product { public override void Create() { Console.WriteLine("Create a Product of TVC"); } } public class ProductSimpleFactory//工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。 { public Product CreateProduct(string pro) { switch (pro) { case "TVA": return new TVA(); case "TVB": return new TVB(); case "TVC": return new TVC(); default: return null; } } } } 工厂类角色Creator (ProductSimpleFactory):工厂类在客户端的直接控制下(Create方法)创建产品对象。 抽象产品角色Product ( Product):定义简单工厂创建的对象的父类或它们共同拥有的接口。可以是一个类、抽象类或接口。 具体产品角色ConcreteProduct (TVA,TVB,TVC):定义工厂具体加工出的对象

面向对象的编程,并不是类越多越好

举例:简单工厂类实现计算器的简单运算

产生简单工厂类

public class OperateFactory { public static Operate CreateOperate(string operate) { Operate oper= null; switch(operate) { case "+": oper = new OperateAdd(); break; case "-": oper = new OperateMinus(); break; case "*": oper = new OperateMulti(); break; case "/": oper = new OperaterDiv(); break; default: break; } return oper; } }

简单工厂类

public abstract class Operate { private double numberA; private double numberB; public double NumberA { get { return numberA; } set { numberA = value; } } public double NumberB { get { return numberB; } set { numberB= value; } } public virtual double GetResult() { double result = 0.0; return result; } //若子类没有重写父类的虚方法,父类对象必须强制转换为子类,才可以调用子类的方法; //若子类重写了父类的虚方法,则直接调用父类的方法即可。 }

加法类

public class OperateAdd : Operate { public override double GetResult() { double result = 0; result=NumberA+NumberB; return result; } }

减法类

public class OperateMinus : Operate { public override double GetResult() { double result = 0; result = NumberA -NumberB; return result; } }

乘法类

public class OperateMulti : Operate { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } }

除法类

public class OperaterDiv : Operate { public override double GetResult() { double result = 0; if(NumberB==0) { throw new Exception("Cannot div zero"); } else { result = NumberA / NumberB; } return result; } }

用户

class Program { static void Main(string[] args) { Operate op; op = OperateFactory.CreateOperate("*"); op.NumberA = 10; op.NumberB = 70; Console.WriteLine("{0}",op.GetResult()); Console.Read(); } }

..

转载请注明原文地址: https://www.6miu.com/read-45543.html

最新回复(0)