设计模式(1)---简单工厂模式

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

引言:

从接触编码到现在有一段时间了,总是在为一些基础语法、技能而不断学习,学着学着感觉有些茫然。在上一篇曾经说过一大牛的教诲:“c语言、java语言、C#语言这些都是一些基本的工具,而它们其中的语法、技能都是一些很简单的基础知识,刚接触编码时肯定会有很多的知识、技能你不懂,但你只要碰到并且学习肯定能够熟练使用。所以语言、技能都不重要,重要的是脱离语言工具的思想,编程的思想。设计模式是思想的体现,多多学习肯定没错”。这之后一直在看设计模式方面的书,但“纸上得来终觉浅,绝知此事要躬行”,于是想把看的书、评论、博客等一些东西总结到一块摘写出来,加深印象同时方便学习。现在开始第一篇:简单工厂模式。

定义:

定义一个类专门负责创建其他类的实例,具体创建什么实例由传入的参数而决定,并且这些类都共同继承于一个父类或者有共同的接口。简单工厂模式是工厂模式家族中最简单的一种实用模式,也可以说是不同工厂模式的一个特殊实现。

简单工厂符合面向对象重要原则之一:封装改变。

参与者:

工厂角色Creator:模式的核心,负责创建所有实例,根据传入的参数,决定创建什么类型的实例。

抽象产品角色PRoduct:上述所有类的父类或者是接口。

具体产品角色Concrete Product:由工厂类创建出来的具体的产品实例。

UML图:

举例说明:

列举大话设计模式中的一个计数器例子,制作一个计数器,进行加减乘除运算。

抽象产品角色:父类(运算类)

publicclassOperation

{privatedoublenumberA =0;privatedoublenumberB =0;publicdoubleNumberA

{get{returnnumberA; }set{ numberA =value; }

}publicdoubleNumberB

{get{returnnumberB; }set{ numberB =value; }

}publicvirtualdoubleGetResult()

{doubleresult =0;returnresult;

}

}

具体产品角色:子类(加减乘除)

classOperationAdd : Operation

{publicoverridedoubleGetResult()

{doubleresult =0;

result= NumberA +NumberB;returnresult;

}

}classOperationSub : Operation

{publicoverridedoubleGetResult()

{doubleresult =0;

result= NumberA -NumberB;returnresult;

}

}classOperationMul : Operation

{publicoverridedoubleGetResult()

{doubleresult =0;

result= NumberA *NumberB;returnresult;

}

}classOperationDiv : Operation

{publicoverridedoubleGetResult()

{doubleresult =0;if(NumberB ==0)

{thrownewException("除数不能为0");

}

result= NumberA /NumberB;returnresult;

}

}

工厂角色:建造各种实例

publicclassOperationFactory

{publicstaticOperation CreateOperate(stringoperate)

{

Operation operation=null;switch(operate)

{case"+":

operation=newOperationAdd();

break;case"-":

operation=newOperationSub();

break;case"*":

operation=newOperationMul();

break;case"/":

operation=newOperationDiv();

break;

}returnoperation;

}

}

客户端调用:

staticvoidMain(string[] args)

{

Operation operation;

operation= OperationFactory.CreateOperate("-");

operation.NumberA=3;

operation.NumberB=7;doubleresult =operation.GetResult();

Console.WriteLine(result);

Console.ReadLine();

}

到此,一个简单的计数器实例编写完毕。客户端向工厂类传入参数“-”,工厂类根据传入的参数创建具体的产品实例,然后进行运算。

简单工厂模式优点:

简单工厂模式解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任,而仅仅是消费产品。低耦合,与外界具体产品类分开。

实现代码复用。

缺点:

违反了高内聚的原则,直接导致:如果需要创建新的类,也就必须改变工厂类。

适用场合:

适用于创建的对象比较少的情况;

适用于客户端只负责传入参数而不关心创建实例的内部逻辑。

补充:

看的设计模式第一个就是简单工厂模式,但是实际项目中一直没有用,前几天一个同事为了解决项目问题用了简单工厂模式,事后跟他一讨论才知道,那哥们比较牛,没有看过设计模式,就是根据自己的想象写出一个小架构,符合简单工厂模式。此处只是为了加速对简单工厂模式的理解,大致讲解该项目的系统框架。

该项目是:为了集合多厂商产品SDK而开发出来的一套产品,目前仅有A和B厂商的SDK。编写简单框架,满足扩展要求,实现产品功能。

首先编写一个接口类:

interfaceIMethod

{

void method1();

void method2();

}

其次是A和B厂商都继承IMethod接口:

classA:IMethod

{voidmethod1()

{//user ASDK}voidmethod2()

{//user ASDK}

}classB:IMethod

{voidmethod1()

{//user BSDK}voidmethod2()

{//user BSDK}

}

工厂类,即决定调用什么方法:

classFactory

{publiccharfactorySDK;publicFactory(charfactorySDK)

{this.factorySDK =factorySDK;

}publicIMethod CreateSDK(charfactorySDK)

{

IMethod method=null;switch(factorySDK)

{caseASDK:

method=newA();

break;caseBSDK:

method=newB();

break;default:

break;

}returnmethod;

}

public void Method1()

{

method.Method1();

}

public void Method2()

{

method.Method2();

}

}

如果下次需要把C厂商产品的SDK也集中进去,如果没有新的需求,那么便不需要增加新的方法,只需要建造一个C类,继承IMethod接口。同时在工厂类中新增一个new C即可。通过此项目,从理论方面学习设计模式进入到实际的项目实践中去,虽然是看到别人写的,但最自己也是一个不小的收获。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航