简单工厂模式:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
这是它的概念这么看,肯定也没看懂啥,那就直接上源码吧。。
场景:我有一个工厂,然后我有电脑、手机两个产品,他们我都能生产,他们有些零件是都能用的,但是现在有商家要我生产电脑、有商家要我生产手机,但是我也不知道这个商家到底需要什么,所以我想知道商家到底需要生产什么 ,比如给我发给消息什么的让我知道。
首先来个产品基类,这个里面呢,我要生产零件
/// <summary> /// 首先声明一个产品父类 /// </summary> public abstract class Product { /// <summary> /// 声明公共方法 /// </summary> public void Production() { Console.WriteLine("生产零件"); } /// <summary> /// 我这个产品具体是干嘛的 /// </summary> public abstract void WhatProduction(); }
然后我的手机产品
/// <summary> /// 我有一个手机的产品 /// </summary> public class Phone : Product { public override void WhatProduction() { Console.WriteLine("生产手机"); } }
再来一个电脑的
/// <summary> ///一个电脑产品 /// </summary> public class Computer : Product { public override void WhatProduction() { Console.WriteLine("生产电脑"); } }
现在再来个接受商家信息的工厂类
public static class Factory { public static Product GetProduct(string productName) { Product product = null; if (productName.Equals("电脑")) { product = new Computer(); } else if (productName.Equals("手机")) { product = new Phone(); } return product; } }
现在有个商家要我生产电脑。。。
class Program { static void Main(string[] args) { { //简单工厂模式 Product product = Factory.GetProduct("电脑"); product.Production(); product.WhatProduction(); } Console.ReadKey(); } }
再来看一下打印的结果
同理我想生产手机,那我输入手机就行了。
上代码之后这个简单工厂模式还是容易理解的。其实我们平时用switch也是可以的,我平常可能写过这样的代码但是不知道这种类型的处理叫啥名字,希望这个博客能够帮需要的人解惑。
那么凡事都有利弊,
优点:
1.简单工厂模式实现了对象的创建和使用的分离,这个从代码是能够看出的,我在Factory里面创建对象,而在Mian方法中使用对象。
2.只需要对应的参数就能够生产不同的产品。
3.这个其实是书上说的一个好处,读取配置文件的参数能够让代码符合开闭原则,配置文件大家都知道的,我要用啥,配置文件里面改一下就行了。也不用在代码里面改了。
缺点:
1.由于工厂类集中了所有产品的创建逻辑,职责过重。
2.使用简单工厂模式势必会增加系统中类的引用个数(引入了新的工厂类),增加了系统的复杂度和理解难度。
3.系统扩展难,一旦添加新的产品,那就需要修改逻辑,比如我们工厂可以造直升机了呢,那不得又要改代码
4.简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级接口,在c#语言中,不能通过类的实例来访问静态方法和静态变量,无法在客户端代码代码中针对工厂父类编程,而在运行时使用工厂子类对象覆盖父类。因此,工厂类不能很好拓展。
适用环境:
其实看了他的优缺点,很容易得出结果,这种模式只能在处理的东西比较少的时候比较好用,其他的复杂情况并不适用。