工厂模式理解了没有?Java3y

昨天写了单例模式了,今天是时候写工厂模式啦~

工厂模式我个人认为其实比较难理解的,如果有接触过|听过|见过该模式的同学很可能就会想:我自己new一个对象出来就好了,简单快捷。用得着你这个工厂模式吗?搞一个工厂出来还要写一大堆的代码呢~

网上的很多资料都是在阐述着:工厂模式的好处就是解耦。相信大家对解耦这个词也不陌生,那解耦究竟有什么好处呢?

在《设计模式之禅》这本书中分了两章节讲工厂模式:

网上的大部分资料都是将工厂模式分成三种:

看完上面的叙述是不是想打死我,什么鸟玩意?不急哈,下面我会一一讲到~~

想想我们为什么要用工厂模式?下面我就简单举例子:

文件IO的操作我们会经常用得到吧,所以BufferedReader对象经常要创建的:

//创建一个BufferedReader对象BufferedReaderbf=newBufferedReader(newFileReader(newFile("aa.txt")));你说麻烦吗?其实也不麻烦,就一行代码嘛,哪里麻烦了~如果不太熟悉IO流的同学就没有那么机灵了,创建一个BufferedReader可能就是以下的代码了:

Filefile=newFile("aa.txt");FileReaderfileReader=newFileReader(file);BufferedReaderbufferedReader=newBufferedReader(fileReader);你说麻烦吗?其实也不麻烦,不就是三行代码嘛,哪里麻烦了~如果这个应用很多的类上都用到了BufferedReader对象的话,那每个类都写上这三行代码了。那你说麻烦吗?那肯定麻烦啊,还用想啊....

可以看出来,创建一个BufferReader对象里面需要一个FileReader对象,而FileReader对象又要File对象。那创建这个BufferReader对象还是比较麻烦的(代码上看不麻烦,从构造上看还是挺麻烦的)!

虽然比较麻烦,但我们还能用,能用就行!于是乎,我们就去写代码了,现在有三个类都要进行文件的读写操作,于是他们就有这样的代码:

此时:上头说,我要换成LineNumberReader来读写,有这个需求!那我们作为一个写代码的,能怎么办?很绝望也需要去完成呀。

哎,写个代码屁事真多...那有没有一种方法能够让创建对象变得简单而且修改对象时能很方便呢?

再说从面向对象的角度来看:我一个操作文件的类还要我会创建BufferReader是不是有点过分了?(职责没有分工好)

何为工厂?将我们的产品都交由工厂来生产!我现在用的iphone5s,从哪来?从富士康组装而来,富士康是工厂。我用得着知道iphone5s在富士康是怎么组装起来的吗?不需要。

来,我们来改造一下上面的例子。首先我们创建一个工厂类,它可以生产Reader对象!

//创建Reader对象的工厂publicclassReaderFactory{publicstaticReadergetReader()throwsFileNotFoundException{Filefile=newFile("aa.txt");FileReaderfileReader=newFileReader(file);BufferedReaderreader=newBufferedReader(fileReader);returnreader;}}那么我们要得到BufferReader对象就贼简单了:

publicclassFileOperateA{publicstaticvoidmain(String[]args)throwsFileNotFoundException{//-------我有工厂了,还用自己搞吗?不用了!//Filefile=newFile("aa.txt");//FileReaderfileReader=newFileReader(file);//BufferedReaderbufferedReader=newBufferedReader(fileReader);//-------我有工厂了,还用自己搞吗?不用了! //用工厂来创建出对象Readerreader=ReaderFactory.getReader();//读写文件....}}工厂将我们创建的对象过程给屏蔽了!

此时我要改成LineNumberReader怎么玩?在工厂上改一下就好了:

我们的调用方FileOperateA|FileOperateB|FileOperateC这些类完全就不用变!

从上面的工厂模式体验我们就可以看到:

这就是解耦的好处!

我再放下我之前练习的时候写过的代码吧:

我有一个DaoFactory,逻辑很简单就是专门创建Dao对象的~

那么在Service层就可以使用工厂将想要的Dao对象初始化了~

此时我们的Service与Dao的对象低耦合的~

在Service与Controller层我也弄了一个ServiceFactory,根据当时业务的需要(添加权限),我创建Service时就非常灵活了:

在一开始我就说了,工厂模式可以分成三类:

下面我就逐一来介绍一下每一种工厂模式有什么不一样~

三种模式都以:Java3y要买宠物的例子来讲解~

很多博客都是以简单/静态工厂模式,工厂方法模式,抽象工厂模式这个顺序来讲解工厂模式的。我认为按书上的顺序比较好理解~因为简单/静态工厂模式是在工厂方法模式上缩减,抽象工厂模式是在工厂方法模式上再增强。

Java3y每天写代码很无聊,想要买只宠物来陪陪自己。于是乎就去宠物店看宠物啦~~~

作为一间宠物店,号称什么宠物都有!于是乎,店主宣传的时候就说:我的宠物店什么宠物都有!

于是构建宠物的工厂就诞生了~

猫工厂:

//继承着宠物工厂publicclassCatFactoryimplementsAnimalFactory{@Override//创建猫publicAnimalcreateAnimal(){returnnewCat();}}狗工厂也是一样的:

//继承着宠物工厂publicclassDogFactoryimplementsAnimalFactory{ //创建狗 @Override publicAnimalcreateAnimal(){ returnnewDog(); }}嗯,还有我们的实体类:猫、狗、动物(多态:猫和狗都是动物,可以直接用动物来表示了)

动物实体类:

publicabstractclassAnimal{ //所有的动物都会吃东西 publicabstractvoideat();}猫实体类:

publicclassCatextendsAnimal{ //猫喜欢吃鱼 @Override publicvoideat(){ System.out.println("猫吃鱼"); }}狗实体类:

publicclassDogextendsAnimal{ //狗喜欢吃肉 @Override publicvoideat(){ System.out.println("狗吃肉"); }}那么现在Java3y想要一只狗,跟了宠物店老板说,宠物店老板就去找狗回来了:

//要买蜥蜴..AnimalFactoryfff=newLizardFactory();Animalaaa=ff.createAnimal();aaa.eat();优点:

缺点:

工厂方法类图:

现在宠物店生意不好做啊,号称“什么宠物都有",这吹过头了~~于是店主只卖两种常见的宠物了。

所以我们的工厂是这样子的:

publicclassAnimalFactory{publicstaticDogcreateDog(){returnnewDog();}publicstaticCatcreateCat(){returnnewCat();}//外界想要猫要狗,这里创建就好了publicstaticAnimalcreateAnimal(Stringtype){if("dog".equals(type)){returnnewDog();}elseif("cat".equals(type)){returnnewCat();}else{returnnull;}}}三个实体还是没变(动物、猫、狗)....

那么Java3y去宠物店买猫狗的时候,告诉老板我要猫、我要狗:

//拿到狗AnimalA=AnimalFactory.createAnimal("dog");A.eat(); //拿到猫AnimalC=AnimalFactory.createAnimal("cat");C.eat();现在问题来了:

简单工厂类的优点也很明显:我就一个具体的工厂来创建对象,代码量少。

抽象工厂模式就比较复杂了,我们一般的应用都写不到。我首先来简述一下需求吧:

那我们的猫和狗都是有性别的,不是公的就是母的~~

具体的代码是这样的:

我们的最大工厂还是定义了创建什么动物

publicinterfaceAnimalFactory{ AnimalcreateDog(); AnimalcreateCat();}创建母猫和母狗的工厂:

publicclassFemaleAnimalFactoryimplementsAnimalFactory{//生产母狗和母猫@OverridepublicAnimalcreateDog(){returnnewFemaleDog();}@OverridepublicAnimalcreateCat(){returnnewFemaleCat();}}创建公猫和公狗的工厂:

publicclassMaleAnimalFactoryimplementsAnimalFactory{//生产公狗和公猫@OverridepublicAnimalcreateDog(){returnnewMaleDog();}@OverridepublicAnimalcreateCat(){returnnewMaleCat();}}这是所有动物都拥有的普遍行为:

publicabstractclassAnimal{ //所有的动物都会吃东西 publicabstractvoideat(); //所有的动物都有性别 publicabstractvoidgender();}这是猫都拥有的普遍行为:

publicabstractclassCatextendsAnimal{ //猫喜欢吃鱼 @Override publicvoideat(){ System.out.println("猫吃鱼"); }}这是狗都拥有的普遍行为:

publicabstractclassDogextendsAnimal{ //狗喜欢吃肉 @Override publicvoideat(){ System.out.println("狗吃肉"); }}猫分为公猫、母猫。狗分为公狗和母狗:

publicclassFemaleCatextendsCat{publicvoidgender(){System.out.println("IamafemaleCat");}}.....

简单来说:工厂方法模式的工厂是创建出一种产品,而抽象工厂是创建出一类产品。

这是抽象工厂模式的类图:

抽象工厂模式说到底就是多了一层抽象,减少了工厂的数量。

THE END
1.猫粮狗粮反向出海!速卖通给宠物食品工厂开了个新类目速卖通给宠物食品工厂开了个新类目 猫粮狗粮终于可以跟着跨境电商一包一包出海了! 6月,速卖通率先开启宠物食品类目,为国内宠粮工厂打开了一条零售出海的新渠道。 根据市场研究公司Packaged Facts数据,宠物食品占据着宠物类目最大的市场份额,高达75%,而我国是全球宠物食品的主要出口国家之一。以往,宠物食品只能通过传统...http://www.ccpitcft.com/newsinfo/7293925.html
1.2024如何开设宠物用品店所需资质及费用介绍在2024年,开设一家宠物用品店网店是众多创业者的热门选择,得益于宠物市场的持续扩大和对宠物用品日益增长的需求。要想在竞争激烈的市场中获得成功,就需要精心规划和管理。以下是一些关键步骤、所需资质及费用的详细说明,以指导您在2024年开设宠物用品店网店。 http://www.5niang.com/article/191.html
2.开宠物店都需要什么?资金耗材等准备工作详解一个好的宠物店团队可以带来好的业绩,留住老顾客,带来新顾客!宠物行业是一个新兴行业,我们需要保持宠物店人员良好的技能和良好的服务。获取开宠物店的免费信息: 怎样才能开一家宠物店?加入盛宠宠物,向投资者传授运营知识,从前期的选址、装修到后期的运营、技术培训等,一步步帮助投资者成功开设宠物店。免费获取开宠物...https://www.xkyczp.com/detail/200719.html
3.从家庭作坊到年销4亿,台州夫妻的“奇葩”小生意卡诺宠物拥有用品厂、粮食厂、刨花厂等自有供应链,一是掌握小宠产品的研发开品能力,快速响应市场趋势,二是高度自产自销,形成规模优势。 深度联动500个KOC,与品牌一起做市场教育 小宠市场尚未被充分认知,卡诺每年的推广费仅占5%,更大势能来自与500个垂直KOC的联动,包括品类教育、新品测试等。 https://www.thepaper.cn/newsDetail_forward_27224313
4.来临沂宠物供应链大会,这48家工厂抢先看提前约展会汇聚宠物 山东汇聚宠物食品有限公司位于风景秀丽的潍坊市临朐县治源街道,是一家专业定制高端宠食的宠物食品企业,公司现有三个宠物湿粮加工工厂,一个主粮代工厂,主营零食罐、猫条、妙鲜包、火腿肠等上千个品类的产品。 公司现具有出境饲料注册登记书、IS09001质量体系认证、饲料生产许可证、BRCGS全球食品安全标准认证...https://www.petdhw.com/show-42388.html
5.历经三年打磨,山东小顽童宠物成“行业标杆”,乖宝集团高层到厂...小顽童自建厂开始,创始人王闻的思路就跟同期建厂的老板想法不太一样,站在风口上市场的钱不断涌来的时候,他还是保持了克制,没有因为那么急着赚钱而放弃掉一些建厂过程中的细节,他甚至是个“变态的”细节控。 开始建厂前的一年,他就开始接触老牌的宠物粮设备制造商江苏正昌和江苏丰尚,疯狂研究宠物粮生产的工艺和设...https://i.ifeng.com/c/8NN9AyRh91Q
6.狗粮代工厂猫粮代工厂宠物食品专业代工厂家山东帅克山东汉欧公司完整的产业链结构,畜禽养殖过程管、粮食入厂加严检验,自建鲜肉生产车间、宠物专用油脂车间、天然风味剂—肝粉厂,每个工序、每个环节都能进行***质量管。凭借多年的宠物养殖测试经验,对每批产品的性能、适口性都在功效测试基地进行分类测试,确保每个产品都能满足宠物的生理需求,符合产品的设计功效。凭借沂蒙人***...https://www.china.cn/gougoukouliang/4657203624.html
7.java的设计模式工厂模式工厂模式一般放在哪一层现在宠物店生意不好做啊,号称“什么宠物都有",这吹过头了~~于是店主只卖两种常见的宠物了。 既然就只有两种宠物的话,那就没必要有”猫厂“、”狗厂“了,一个猫狗厂就行了! 所以我们的工厂是这样子的: publicclassAnimalFactory{ publicstaticDogcreateDog() { ...https://blog.csdn.net/weixin_44800330/article/details/92089518
8.悠贝创始人王艾峰:服务覆盖1000+家宠物门店宠吾代然而2014年,王艾峰代理的两个自行车品牌出了问题,于是结束了在自行车行业长达十年生涯,决定出来自己创业。 2015年,对各行业做了一个调研,他发现宠物行业与自行车行业有着诸多相似之处,运动自行车是一种休闲方式,养宠物也是一种休闲方式,但是消费者对这两个的理解度都不够深,需要引导。 https://www.shangyexinzhi.com/article/23200259.html