设计模式
通过学习《大话设计模式》和《GOF》可以总结出设计模式是一套在面向对象编程中被反复使用、多数人熟悉的代码设计经验的总结。通过使用设计模式可重用代码,保证代码的可靠性和可移植性。设计模式是面向对象编程的基石,合理的使用设计模式对开发人员的代码编写起着重要作用。
简单工厂
简单工厂类:对于工厂一词,应该很熟悉,工厂主要负责生产各种具体产品.作为客户端,我们只需要告诉工厂,我们具体想要哪种产品就可以了.工厂类通过我们所给信息,进行动态选择生产.但是工厂和其他运算子类的耦合性过高,这不是我们想要的.
运算类:运算类作为各种子类的父类出现,它拥有所有子类的属性和方法.当需要添加子类,只需要添加子类就可以,这样遵循了扩展开放原则,但在工厂类中由于使用多选择结构,会导致对工厂类进行修改,这样就违背了"修改关闭"原则
子类:子类主要负责自己内部实现的具体细节,由此可以体现出"高内聚"
多态的体现:面向对象的三大机制,不得不提的是多态机制,下面通过代码让我们具体来看"多态"在简单工厂中的应用,相信看到代码,很多人都会有所领悟多态在自己的面向对象编码中经常使用,但是多态的机制是建立在抽象中实现的
classOperationFactory
{
public static OperationcreateOperation(string operate)
{
Operation oper = null;
switch (operate)
{
case"+":
oper = newOperationAdd();//oper是父类,但可以根据客户端传来的参数,动态选择生成子类(加)
break;
case"-":
oper = newOperationSub();//oper是父类,但可以根据客户端传来的参数,动态选择生成子类(减)
break;
case"*":
oper = newOperationMul();//oper是父类,但可以根据客户端传来的参数,动态选择生成子类(乘)
break;
case "/":
oper = newOperationDiv(); //oper是父类,但可以根据客户端传来的参数,动态选择生成子类(除)
break;
}
return oper;
}
}
工厂方法模式
工厂方法模式定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个雷的实例化延迟到其子类.
工厂类:此时这个工厂类也像运算类作为一个父类出现(或者是接口),它拥有子类公共的方法,而它的职责与简单工厂担当的职责所以不同,因为它是父类,其下可以扩展多个子类.
工厂子类:每个工厂子类,负责生产自己的产品(加法类/减法类…)这里,仅负责生产,而生产的细节还是由具体子类内部去实现,也就是说无论你是父类工厂还是子类工厂,永远负责生产对象的责任.
运算类与运算子类功能与简单工厂中一样
简单工厂PK工厂方法
在简单工厂中已经提到了简单工厂有几个缺点1.工厂类负责过多的生产(与具体子类耦合性过高) 2.当添加运算子类的时候需要修改工厂类,违背了"修改关闭原则" 出于这种需求,伟大的人类对简单工厂进行改造,出现了工厂方法,工厂方法将简单工厂中的工厂类升级为工厂父类,然后由各种具体工厂子类去集成父类,避免了添加子类时出现的修改工厂类父类,也就是说符合了"扩展开放"原则,而每一个具体工厂只负责自己相关产品的生产这样也符合了"单一职责",而简单工厂中的多态体现提炼到了客户端
这是工厂方法中的工厂类和工厂子类的具体代码
//工厂接口
interface IFactory
{
Operation CreateOperation();
}
//加法工厂
class AddFactory::IFactory
{
public Operation CreateOperation()
{
return new OperationAdd();
}
}
//减法工厂
//乘法工厂
//除法工厂
下面是客户端代码
class Client
{
static void Main(string[] args)
{
IFactory factory =new AddFactory(); //由客户端来决定实例化哪个具体工厂
Operation oper =factory.CreateOperation(); //运算类父类来接受工厂子类的返回值
oper.numberA = 1;
oper.numberB = 2;
oper.GetResult();
}
}
PS:从学习设计模式的角度来说,我只是学会了怎样使用上面介绍的两种设计模式,也就是说仅局限于对“以封装好的设计模式学习应用阶段”对真正领悟设计模式的内涵还欠缺很多,希望路过的朋友脚下留情!