最近在学习设计模式,今天要谈起简单工厂模式和工厂模式。但在提起两个模式之前,必不可少的一项任务就是要讲一下设计模式中的重要的原则。
开放-封闭原则:面向对象的核心原则。从字面上理解,开放:允许别人的进入,封闭:有一定的保守保密性。在面向对象设计中,软件的实体(类,模块,函数等等)应该可以扩展,但是不能修改。从而使得系统具有可维护,可扩展,灵活性强的特点
依赖倒转原则:高层模块不应该依赖底层模块,而是两者都应该依赖与抽象。抽象不应该依赖细节,细节应该依赖抽象。抽象的事物很难去改变。这样保证代码,系统的稳定性。
最初接触的是简单工厂模式。因为第一章,从面向过程的代码一直敲到面向对象,再到使用了简单工厂模式,心中不免有些小激动
public class OperationFactory
{
public static Operation createoperation(string operate)
{
Operation oper = null;
switch (operate)
{
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper =new OperationDiv ();
break ;
}
return oper ;
}
}
只要是敲过设计模式的对这段代码都很熟悉。这是小菜敲得关于计算器的代码,经过三番五次的改动,在大鸟的教导下,利用简单工厂模式写出了此代码。先说一下这段代码相对之前的好处:
使得客户端和后台分工明确,我也不知道客户要选择哪一个用法,我也不能让客户去自己判断,所以就写了一个简单工厂的例子,将选择只的语句写在其中,而当客户想要实例化选择哪一个用法的时候只需要将自己的想法写在客户端上,其他的事情由我们的后台来完成。保证了面向对象的封闭性。
对比起来简单工厂模式还是很实用的。但是他存在一个最大的问题就是违背设计模式中一个很重要的原则:开放——封闭原则。
所以当用户还想有加减乘除之外的另一种运算,我们不得不去修改我们的简单工厂模式中的工厂类,虽然只是修改一次不算什么,但是当我们在自认为的“添加代码”——(实际的修改模块)的时候,也许某个地方与以前的一段代码发生冲突,这样最终的结果就是会造成程序不能运行,这样会带来很大的损失。
学完工厂模式之后,我发现简单工厂模式其实是我们这些对C#或者面向对象初学者的一个垫脚石。接下来的工厂模式就会解决简单工厂模式中所出现的一些重大的漏洞。
class LeiFeng
{
public void Sweep()
{
Console.WriteLine("扫地");
}
public void Wash()
{
Console.WriteLine("洗衣");
}
public void BuyRice()
{
Console.WriteLine("买米");
}
}
class UnderGradute : LeiFeng
{}
class Volunteer : LeiFeng
{}
interface IFactory //工厂就是抽象出一个类和工厂的接口:(抽象类),这是运用的是面向对象设计中的依赖倒转原则
{
LeiFeng CreatLeiFeng();
}
class UndergraduateFactory : IFactory
{
public LeiFeng CreatLeiFeng()
{
return new UnderGradute();
}
}
class VolunteerFactory : IFactory
{
public LeiFeng CreatLeiFeng()
{
return new Volunteer();
}
}
虽然两个例子不一致,但是通过对比我们可以看出,此代码中是工厂模式,他省去了简单工厂的选择判断这一项,而是增加了一个工厂类,此类是根据,父类,子类抽象得到的类。这样符合设计模式中的依赖倒转原则,减少类之间的耦合度。同时当我们想增加新的一类人的时候,可以去写一个关于此功能的新的类,然后继承抽象出来的类就可以了,这样代码得到了扩展,实现新增功能,同时也保持原代码的封闭性。
很多的知识通过比较才知道原来他比他优秀在这个地方。做人和学习也一样,时常和别人去比较才发现原来自己存在这样或者那样的缺点。别人是自己的一面镜子,时不时得照一照,对比一下。
别人无形的帮助,和自己努力的改变,会让自己变得更优秀。