笑说设计模式-小白逃课被点名 (2)

黑皮:”然后定义一个简单工厂,静态方法传入操作符参数得到实际的业务处理类,客户端得到处理类后对参数赋值。最后一步你应该知道怎么做了吧“

小白:”我懂了,那客户端这么调用就可以了“。

static void Main(string[] args) { Console.WriteLine("请选择操作符号(+、-、*、/)"); string operateStr = Console.ReadLine(); Operate operate = OperateFactory.GetOperateFactory(operateStr); operate.NumberA = 10; operate.NumberB = 4; double result = operate.GetResult(); Console.WriteLine(result); Console.ReadKey(); }

老师:”看来俩位同学都已经掌握了简单工厂的使用,接下来我提问几个问题,便于大家更快的掌握这种设计模式“

老师:”如果我们要修改除方法的逻辑,增加被除数为0的逻辑应该怎么做“

小白:”直接修改OperateDiv类,这不会对其他造成影响“

老师:”如果我们要新增一个开根运算应该怎么做“

小白:”添加一个新的类,Operate开根类,里面描述开根的逻辑。在工厂方法中将新的操作符添加进去即可。新增的操作单独一个类,也不会对其他方法体造成影响“。

小白:”那客户端需要做什么改变吗?“

老师:”客户端要做什么改变,客户端只要处理好自己的事情就可以了!“

是的,客户端不关心工厂创建了什么,工厂是一个黑盒子。客户端只要传入参数,工厂负责将内容生产后【实例化类的过程】给客户端即可。

优/缺点

简单工厂模式的工厂类一般是使用静态方法,通过接收的参数不同来返回不同的对象实例。不修改代码的话,是无法扩展的
优点:客户端可以免除直接创建产品对象的责任,而仅仅是“消费”产品。简单工厂模式通过这种做法实现了对责任的分割
缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了

工厂方法

时间:2021年2月19日下午 地点:教室 人物:学生小白、老师、大佬黑皮

老师:”我们紧接着上午的设计模式继续,上午我们讲的是简单工厂,下午我们讲下一个内容工厂方法。工厂方法和简单工厂其实大同小异,唯一的区别就在于每一个实现抽象类的实例(也叫做产品,即上午定义的加减乘除四个子类)都有一个对应的工厂去创建。同学们了解一下老师说话的内容,然后寻找一个场景编码实现一下。最快完成的有课堂奖励”

....几分钟过去了.....

小白:“老师,我完成了。”

老师:“好的,那我们请小白同学说明一下场景和实现的方式。”

我设计的是以水果作为场景的模式。

1、定义一个抽象类Fruit.cs,这个类定义俩个抽象方法printfColor()printfName()

2、实现俩种不同的水果分别继承此抽象类并复写抽象方法。

3、定义一个工厂接口,定义接口方法createFruit()

4、实现俩个不同的工厂分别实现水果实例的创建。

水果抽象类

public abstract class Fruit { public abstract void PrintfColor(); public abstract void PrintfName(); } public class Apple : Fruit { public override void PrintfColor() { Console.WriteLine("红色"); } public override void PrintfName() { Console.WriteLine("苹果"); } }

工厂接口

public interface IFruitFactory { Fruit CreateFruit(); } public class AppleFactory : IFruitFactory { public Fruit CreateFruit() { return new Apple(); } }

客户端实现

//苹果工厂 IFruitFactory appleFac = new AppleFactory(); Fruit apple = appleFac.CreateFruit(); apple.PrintfColor(); apple.PrintfName //橘子工厂 IFruitFactory orangeFac = new OrangeFactory(); Fruit orage = orangeFac.CreateFruit(); orage.PrintfColor(); orage.PrintfName();

老师:“看来小白同学已经对上午的内容有了一个充分的了解,果然好好上课才能够学习到新的知识。逃课是没有益处的”

老师:“只是这样的案例太过简单,可能其他同学不是很能理解为什么要这样 ,我来举一个实际场景的案例方便大家理解。在实际的工作过程中我们总会用到日志组件,例如Nlog,Log4net这种第三方组件,这种组件都支持可配置化的多源输出。当我们在配置文件(json/xml)中增加一个“输出到控制台的参数”,程序 就会将内容输出到控制台,当配置一个输入到文件的参数,程序就会将内容输出到指定的文件。这种场景的实现其实就是一种典型的工厂方法。下面我来分析一下过程”

1、读取配置文件(json/xml)

2、获取所有的配置方式,循环遍历

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppgpj.html