设计模式-创建者模式-简单工厂模式
一、对工厂模式的理解
1、简单工厂模式属于类的创建模式,又称静态工厂方法模式;
2、通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都是具有共同的父类;
3、角色
3.1 工厂角色-Creator:它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑,工厂类可以被外界直接调用,创建所需的产品对象;
3.2 抽象角色-Product:简单工厂模式所创建的所有对象的父类,它负责描述所有实例共有的公共接口;
3.3 具体产品-Concrete Product:简单工厂模式所创建的具体实例对象;
二、简单工厂模式
简单工厂只是一个方法,根据参数的不同来初始化不同的类。
interface IProduct { void Product(); }
class ProductA:IProduct { public void Product() { Console.WriteLine("ProductA"); } }
class ProductB:IProduct { public void Product() { Console.WriteLine("ProductB"); } }
class Factory { IProduct iproduct; public IProduct Product(string userOrder) { switch (userOrder) { case "A": iproduct = new ProductA(); break; case "B": iproduct = new ProductB(); break; default: iproduct = new ProductA(); break; } return iproduct; } }
class Program { static void Main( string[] args ) { Console.WriteLine("用户同志:我们目前只有两条生产线只能生产A和B两种产品,请输入您需要的产品(A or B)"); string userOrder=Console.ReadLine(); Factory factory = new Factory();//首先实例化一个工厂 IProduct product = factory.Product( userOrder );//创建产品角色 product.Product();//生产具体产品 Console.ReadLine(); //这里客户端没有直接参与具体产品的生产,只是表达他想要啥产品 //下一步讨论的是根据用户的输入,如果没有该产品角色那么就创建该角色,基于配置文件 } }
效率问题:
1.如果构造一个Factory实例,在获取一个抽象类型的实例后就不再使用,资源上有些浪费,当这个获取过程十分频繁的时候,就非常浪费资源了;
解决方案:
(1)把工厂实例作为参数注入到操作中,而不是在每个方法内部自行创建--?
(2)将工厂模式设计为单件方式,这样所有的客户端程序共享唯一的Factory类型实例
三、具体的实现
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactory { public class Operation { public double NumberA { get; set; } public double NumberB { get; set; } public virtual double GetResult() { double result = 0; return result; } } public class OperationAdd : Operation { public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } } public class OperationSub : Operation { public override double GetResult() { double result = 0; result = NumberA - NumberB; return result; } } public class OperationMultiplication : Operation { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } } public class OperationDivision : Operation { public override double GetResult() { if(NumberB==0) { throw new Exception("除数不能为0!!!记住啦"); } else { double result = 0; result = NumberA / NumberB; return result; } } } public class OperationFactory { public static Operation CreateOperate(string operate) { Operation oper = null; switch (operate) { case "+": oper=new OperationAdd();//根据传递的参数不同实例化不同的类
break; case "-": oper = new OperationSub(); break; case "*": oper=new OperationMultiplication(); break; case "/": oper = new OperationDivision(); break; } return oper; } } class Program { static void Main(string[] args) { Console.WriteLine("请输入第一个数字:"); double numberA = double.Parse(Console.ReadLine()); Console.WriteLine("请输入操作符:"); string opera = Console.ReadLine(); Console.WriteLine("请输入第二个数字"); double numberB=double.Parse(Console.ReadLine()); Operation oper = new Operation(); oper = OperationFactory.CreateOperate(opera); oper.NumberA = numberA; oper.NumberB = numberB; double result = oper.GetResult(); Console.WriteLine(result.ToString()); Console.ReadKey(); } } }
参考资料: http://visualcsharp.diandian.com/post/2012-11-05/40041450121