asp.net—工厂模式
一、什么是工厂模式
定义:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类。
二、怎么使用工厂模式
首先模拟一个场景:有一个汽车工厂, 可以日本车、美国车、中国车。。。
这个场景怎么用工厂模式表达出来呢?
要生产汽车所以首先要有个汽车类
//抽象一个汽车类 public abstract class CarBreed { public string Name {get;set;} } public class JapanCar : CarBreed { public JapanCar(){ Console.WriteLine("日本车"); } } public class ChineseCar : CarBreed { public ChineseCar(){ Console.WriteLine("中国车"); } } public class USACar : CarBreed { public USACar(){ Console.WriteLine("美国车"); } }
首先用简单工厂模式:(缺点:工厂类集中了所有产品创建逻辑,不利于扩展)
//汽车工厂(简单工厂) public class CarFactory { public static CarBreed getCarBreed(string car) { switch(car) { case "JapanCar":return new JapanCar(); case "ChineseCar":return new ChineseCar(); case "USACar":return new USACar(); } } }
//程序入口 public class Program { public static void Main(string[] args) { // 日本车 CarBreed mycar = CarFactory.getCarBreed("JapanCar"); //中国车 mycar = CarFactory.getCarBreed("ChineseCar"); //美国车 mycar = CarFactory.getCarBreed("USACar"); Console.ReadLine(); } }
然后用工厂模式:
//汽车工厂(工厂模式) public abstract class CarFactory { public abstract CarBreed getCarBreed(); } //日本车工厂 public class JapanCarFactory : CarFactory { public override CarBreed getCarBreed() { return new JapanCar(); } } //中国车工厂 public class ChineseCarFactory : CarFactory { public override CarBreed getCarBreed() { return new ChineseCar(); } } //美国车工厂 public class USACarFactory : CarFactory { public override CarBreed getCarBreed() { return new USACar(); } }
//程序入口 public class Program { public static void Main(string[] args) { // 初始化工厂 CarFactory Factory = new JapanCarFactory(); //日本车 CarBreed mycar = Factory.getCarBreed(); //中国车 Factory = new ChineseCarFactory(); mycar = Factory.getCarBreed(); //。。。。。。。 Console.ReadLine(); } }
还有一种抽象工厂模式,这个比较复杂暂时还没研究透彻这里就不做阐述
三、为什么要用工厂模式
优势1:一般在代码中,实例化一个类A是直接new A(),假如类A是一个完全独立的类,没有相似类,则没有必要使用工厂模式。但是如果类A本身有一个相似类B,而在实际使用类A或者类B的实例时,如果关心的是类A与类B的共同部分,则工厂模式就可以体现出它的优势。
优势2:初始化封装。在需求一个类的实例时,假如需要一个相同属性的实例,每次初始化的操作是一样的,用工厂模式可以对初始化进行封装,简化操作。
四、工厂模式使用场景
(1)客户端不需要知道它所创建的对象的类。例子中我们不知道每个图片加载器具体叫什么名,只知道创建它的工厂名就完成了床架过程。
(2)客户端可以通过子类来指定创建对应的对象。