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

3、判断配置类型,如果是输入到文件的配置。new一个文件日志工厂,将配置信息作为参数传递,便于后期方法调用;如果是输入到控制台的配置。new一个日志工厂也是做同样的操作

4、每一个工厂只管理自己的事情,但是应该都拥有日志输出这个接口。

5、当上层调用打印方法时候,循环遍历所有的工厂,调用接口的日志输出输出方法

优/缺点

工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品
优点:允许系统在不修改具体工厂角色的情况下引进新产品
缺点:由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量

抽象工厂

抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。

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

新的一天又开始了,“设计模式”课程在小白的眼中好像没有那么复杂了,今天小白早早地就到了教室,准备迎接老师新的鞭策。

老师:”同学们早上好,今天我们继续昨日的课程。昨天讲的是工厂方法,今天我们在此基础上做一点改进,看看又有什么新的变化。小白同学学习热情很高嘛,现在都知道坐在第一排了。不错不错,值得鼓励”

小白:”嘻嘻“

老师:“好,那开始今天的课程。今天要讲的模式是抽象工厂模式。通过和工厂模式做比较,同学们可以比较清晰的发现这俩都之间的区别。我们用昨天小白同学的例子继续开拓。”

此时有苹果和橘子俩个产品,分别对应苹果工厂和橘子工厂。这是工厂方法的体现。可是如果有3个不同的工厂,他们分别都生产苹果和橘子呢。

小白:“恩...那就多建立几个工厂。每个产品分别对应不同的工厂,应该是这样的一个结构,每一个工厂分别对应生产产品的类”

A

A_苹果工厂.cs

A_橘子工厂.cs

B

B_苹果工厂.cs

B_橘子工厂.cs

C

C_苹果工厂.cs

C_橘子工厂.cs

老师:“这样的方式当然是可以的,可以如果我有10个工厂呢,难道我们要建立10*2=20个类吗,这样程序的复杂度就是直线上升,不利于维护。”

小白:“那怎么办呢,用老师你说的那种抽象工厂吗?如果用,又应该怎么做呢”

老师:“是的,在这样的场景下,抽象工厂是最能匹配的设计模式。其实做法非常简单,对昨天的代码进行一些修改即可”

水果抽象类

新增一个Name属性,方便后期打印不同的工厂。

public abstract class Fruit { public string Name { get; set; } public abstract void PrintfColor(); public abstract void PrintfName(); } public class Apple : Fruit { public Apple(string name) { this.Name = name; } public override void PrintfColor() { Console.WriteLine(this.Name + "红色"); } public override void PrintfName() { Console.WriteLine(this.Name + "苹果"); } }

工厂接口

老师:“这一处的改动就比较明显。原来的接口中方法输出唯一的产品——因为之前每一个工厂只生产一件产品。现在输出俩个产品,即继承工厂接口的类必须实现生产苹果和橘子的方法。这样的好处在于,每一个工厂负责管理自己产品的实现,避免了每一个产品都需要创建一个工厂的操作。“

解释:

工厂生产苹果和橘子。当有多个工厂的时候,每一个工厂都实现生产苹果和橘子。而不是生产A厂苹果需要一个工厂实现类,生产B厂苹果又需要一个。如下所示

旧模式

A

A_苹果工厂.

A_橘子工厂

B

B_苹果工厂

B_橘子工厂

C

C_苹果工厂

新模式

A 工厂

苹果/橘子

B 工厂

苹果/橘子

C 工厂

苹果/橘子

老师:“这样复杂度由原来的6变成了3。”

小白:"我明白了,又学习到了新的东西。"

public interface IFruitFactory { Fruit CreateApple(string name); Fruit CreateOrange(string name); } public class AFactory : IFruitFactory { public Fruit CreateApple(string name) { return new Apple(name); } public Fruit CreateOrange(string name) { return new Orange(name); } }

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

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