Java设计模式之工厂方法模式
一、概述
工厂,就是生产产品的地方。
在Java设计模式中使用工厂的概念,那就是生成对象的地方了。
本来直接就能创建的对象为何要增加一个工厂类呢?
这就需要了解工厂方法要解决的是什么问题了,如果只有一个类,我们直接new一个对象完事,这是最简单的;但是如果有多个类呢,而且这些类还需要针对不同的情况来创建不同的对象,这时候就需要工厂了,我们可以在工厂中根据条件来创建具体的对象。
这样一来就将调用方和具体的目标类进行了解耦,调用方根本就不知道需要创建哪个对象,它只是提出了条件,然后工厂就可以根据给定的条件来决定创建哪一个对象。二、简单工厂方法模式
要说工厂方法模式,不得不先了解下简单工程方法模式,这个模式并不是23种设计模式中的内容。
所谓简单工厂方法模式,就是为目标类创建一个工厂,当有多个目标实现的时候,在这个工厂内部进行逻辑判断来根据条件创建不同的目标实例。
下面看个例子,我就以桌子为例来写:
桌子接口:Desk桌子接口publicinterfaceDesk{StringgetType();}
木质桌子:WoodenDesk木质桌子publicclassWoodenDeskimplementsDesk{privateStringtype木质桌;OverridepublicStringgetType(){returntype;}}
塑料桌子:PlasticDesk塑料桌publicclassPlasticDeskimplementsDesk{privateStringtype塑料桌;OverridepublicStringgetType(){returntype;}}
类型枚举:Type类型publicenumType{PLASTIC,WOODEN;}
桌子工厂:DeskFactory桌子工厂publicclassDeskFactory{publicstaticDeskcreateDesk(Typetype){switch(type){caseWOODEN:returnnewWoodenDesk();casePLASTIC:returnnewPlasticDesk();default:returnnull;}}}
测试类:Clienter测试类publicclassClineter{publicstaticvoidmain(String〔〕args){DeskdeskDeskFactory。createDesk(Type。PLASTIC);System。out。println(desk。getType());}}
执行结果塑料桌
这就是简单工厂方法,只有一个工厂类来面向多个目标实现。当目标实现增多时,我们不得不去修改工厂类的方法,使其兼容新的实现类型,这明显违背了开闭原则,所以出现了工厂方法模式。三、工厂方法模式
工厂方法模式是对简单工厂模式的抽象升级,将工厂这个概念抽象出来成为接口,然后针对每种目标实现类创建一个工厂实现,一对一来实现,当新增了目标实现,只要同时新增一个工厂实现即可。
下面看看实例:
桌子接口:Desk桌子接口publicinterfaceDesk{StringgetType();}
木质桌子:WoodenDesk木质桌子publicclassWoodenDeskimplementsDesk{privateStringtype木质桌;OverridepublicStringgetType(){returntype;}}
塑料桌子:PlasticDesk塑料桌publicclassPlasticDeskimplementsDesk{privateStringtype塑料桌;OverridepublicStringgetType(){returntype;}}
桌子工厂接口:DeskFactory桌子工厂接口publicinterfaceDeskFactory{DeskcreateDesk();}
木质桌子工厂:WoodenDeskFactory木质桌子工厂publicclassWoodenDeskFactoryimplementsDeskFactory{OverridepublicDeskcreateDesk(){returnnewWoodenDesk();}}
塑料桌子工厂:塑料桌子工厂publicclassPlasticDeskFactoryimplementsDeskFactory{OverridepublicDeskcreateDesk(){returnnewPlasticDesk();}}
测试类:Clienter测试类publicclassClienter{publicstaticvoidmain(String〔〕args){DeskFactoryfactorynewWoodenDeskFactory();Deskdeskfactory。createDesk();System。out。println(desk。getType());}}
执行结果:木质桌四、解析
从上面的实例中可以很容易看出来,工厂方法模式的重点就在这个工厂接口了。
目标可以无限扩展,工厂类也要随之扩展,一对一存在,满足了开闭原则,但如果目标实现较多,工厂实现类也会增多,不简洁。
就我实际情况下看到的,在MyBatis中使用的比较多:事务模块和数据源模块都使用了工厂方法模式。
今年10月1国庆假,你们都消费了多少钱?谢邀!国庆七天乐,不曾消费过。一为防疫做贡献,二是囊羞涩。三天看新闻,四日读经典,五湖四海胸中藏,登山观云鹤。没什么销费,因为没出去,在家包饺子,吃水果,看视频,挺好的。……
手机坏了打算买华为nova9,为啥同事建议买nova8?Pro系列的比较好吧,个人观点,我习惯买手机Pro系列不知道为什么,哈哈昨天入手nova9pro,感觉nova8就多了一个5G,现在的5G还不成熟,费用也贵,等两三年没有……
戴助听器会遮蔽耳鸣吗?助听器是一种补偿听力的工具,不是特别的助听器对耳鸣是没有治疗作用的,但如果助听器选配得好,患者耳鸣的主频率又在助听器的放大频率范围内,耳鸣的响度又不是很重,有70的耳鸣是有可能……
微信淘宝抖音大变局!工信部定调为什么微信无法打开淘宝天猫的链接?不同平台分享链接怎么真么难?有没有解决方案?就在近日,这些困扰网民已久的问题终于迎来了突破性进展!知乎平台上网友提问9月13……
Vlog达人最佳选择!三星GalaxyZFlip35G开创视5G时代,网络社交的主流形式从文字、图片进化到了视频和直播,让手机的视频录制能力变得格外重要。然而,传统手机受限于直板形态,必须搭配三脚架等辅助设备才能实现稳定的视频录制,这就……
揭秘数享易购打着开超市的幌子变相传销拉人头非法集资Hi,大家好!我是雷哥。最近看到数享易购平台在很多地方开展业务,就在我所在的区域就有,还有朋友推销到我这来了,有一个现象就是40岁以上人群居多。据了解数享易购平台以超市为幌子,……
微信开始收费,但并不影响正常使用,你们会接受吗?不知不觉中,大家的生活方式已经发生了巨大的改变,因为有了智能手机,加上互联网的融合,让人们能够体验到的生活方式越来越便捷。而且这种工具在全国已经得到了大范围的普及,是打电……
卢伟冰没说谎!Redmi7插卡待机测试,401小时仍然有电红米Redmi自更名后已经先后发布了三款手机,分别是:RedmiNote7,RedmiNote7Pro和Redmi7,定价也有所悬殊,毕竟定位的人群不一样。前两款RedmiNo……
海尔智家打造独具特色的科技创新之路1月17日,海尔集团创新年会上,5大委员会宣布成立。其中,科学与技术委员会瞄准建立科技自立自强的制度体系,是响应实体经济时代的破题之作。据了解,海尔集团在全球建立了10N……
大一新生开学有什么笔记本电脑推荐?具体看用来干什么1、如果是设计类专业,那电脑的配置要高点,因为要装一些例如CAD、proe、UG等设计软件。运行时需要高配置的电脑。高性价比价格在3000左右就有了。……
一文带你解读JavaScript的基本用法前言相信做网站对JavaScript再熟悉不过了,它是一门脚本语言,不同于Python的是,它是一门浏览器脚本语言,而Python则是服务器脚本语言,我们不光要会Pyth……
各方大佬为何发声力挺柳传志?为联想5G投票门拍案而起北京晨报讯(记者焦立坤)柳传志因联想5G投票门拍案而起,随即马云、刘永好、周鸿祎等一批知名企业家纷纷表态力挺。他们为何集体声援柳传志?前天,……