工厂方法模式(FactoryMethod)
工厂方法模式分为三种:
1、普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:

举例如下:(我们举一个发送邮件和短信的例子)
首先,创建二者的共同接口:
publicinterfaceSender{publicvoidSend();}其次,创建实现类:
publicclassMailSenderimplementsSender{@OverridepublicvoidSend(){System.out.println("thisismailsender!");}}publicclassSmsSenderimplementsSender{@OverridepublicvoidSend(){System.out.println("thisissmssender!");}}最后,建工厂类:
publicclassSendFactory{publicSenderproduce(Stringtype){if("mail".equals(type)){returnnewMailSender();}elseif("sms".equals(type)){returnnewSmsSender();}else{System.out.println("请输入正确的类型!");returnnull;}}}我们来测试下:
publicclassFactoryTest{publicstaticvoidmain(String[]args){SendFactoryfactory=newSendFactory();Sendersender=factory.produce("sms");sender.Send();}}输出:thisissmssender!
想详细了解的小伙伴可以去原创作者:https://blog.csdn.net/llussize/article/details/80276627
java工厂模式例子详解
HairFactory类
packagecom.kero99.ygc.project;
publicclassHairFactory{
/**
*设计模式(DesignPattern)
*是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
*工厂模式概念:
*实例化对象,用工厂方法代替new操作。
*工厂模式包括工厂方法模式和抽象工厂模式。
*抽象工厂模式是工厂方法模式的扩展。
*工厂模式的意图:
*定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化。
*工厂方法把实例化的工作推迟到子类中去实现。
*工厂模式使用场景:

*有一组类似的对象需要创建。
*在编码时不能预见需要创建那种类的实例。
*系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节。
*eg:场景脸萌↓
*@paramkey
*@return
*/
publicHairInterfacegetHair(Stringkey){if("left".equals(key)){returnnewLeftHair();}elseif("right".equals(key)){returnnewRightHair();}returnnull;}//反射实现publicHairInterfacegetHairByClass(StringclassName){HairInterfacehair;try{hair=(HairInterface)Class.forName(className).newInstance();returnhair;}catch(InstantiationExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(IllegalAccessExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(ClassNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}returnnull;}}HairInterface接口packagecom.kero99.ygc.project;publicinterfaceHairInterface{//画发型publicvoiddraw();}LeftHair类的实现
packagecom.kero99.ygc.project;publicclassLeftHairimplementsHairInterface{//画了一个左偏分发型@Overridepublicvoiddraw(){//TODOAuto-generatedmethodstubSystem.out.println("左偏分发型...");}}RightHair类的实现packagecom.kero99.ygc.project;publicclassRightHairimplementsHairInterface{//画了一个右偏分发型@Overridepublicvoiddraw(){//TODOAuto-generatedmethodstubSystem.out.println("右偏分发型...");}}Test类
packagecom.kero99.ygc.project;publicclassYGCTest{publicstaticvoidmain(String[]args){//HairInterfaceleft=newLeftHair();//left.draw();//HairInterfaceright=newRightHair();//right.draw();//HairFactoryfactory=newHairFactory();//HairInterfaceleft=factory.getHair("left");//left.draw();//HairInterfaceright=factory.getHair("right");//right.draw();//通过具体类名称获取实例可以用properties工具创建Class地址HairFactoryfactory=newHairFactory();HairInterfaceleft=factory.getHairByClass("com.kero99.project.LeftHair");left.draw();}} © 版权声明
文章版权归作者所有,未经允许请勿转载。
版权声明:
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com