陆小洁 2025-11-03 00:32:48
每经编辑|陈际瓦
当地时间2025-11-03,gufjhwebrjewhgksjbfwejrwrwek,激萌导航使用方法
想象一(yi)下,你正在经营一家玩具工厂,你需要生(sheng)产各种各样的玩具:小(xiao)汽车、芭比娃娃、乐高积木。起初,一切都很简单。每当有订单,你直接拿(na)起对应的模具,加工,然后组装。但很快,问题就来了。
随着玩具种类的增多,你的生产流程变得越来越复杂。你需要维护大量的模具,每增加(jia)一种新玩具,就意味着你需要增(zeng)加一套新的工具和流程。当客户想要定制一款独一无二的玩具时,你更(geng)是头(tou)疼欲裂,因为你需要修改现有的生产线,这不仅耗时,还可能影响其他玩具的生产(chan)。
在软件开发的世界里,我们常常面临类似的问题。当我们创建对象时,如果直接在代码(ma)中硬编(bian)码对(dui)象的(de)创建(jian)逻辑,会带来一系列的麻烦:
紧耦合:客户端代码直接依赖于具体的产品类,一旦产(chan)品类发生变化,客户端代码也必须随之修改。这就像你的玩具订单系统直接连接(jie)到每一个玩具的生产流程,改一个螺丝都需要改整个系统。可扩展性差:想要增加新的产品类型?那你可能需要修改大量创建(jian)对象的代码,这无疑是“牵一发而动全身”。
代码冗余:相似的对象创建逻辑可能会在代码中反复出现,导致代码重复,难以维护。
工厂模式,正是为了解(jie)决这些痛点而诞(dan)生的“神器”。它就像是为你的代码建造(zao)了一条高效、灵活的“生产线”,将(jiang)对象的创建过程与客户端代码解耦,让你的程序更加健壮、易(yi)于扩展和维护。今天(tian),我(wo)们就来深入了解(jie)一下工厂模式的“三驾马车(che)”:简单工厂、工厂方法和抽象工厂,看看它们各自有什么绝活!
简单工厂,顾名思义,就是一种“简单”的工厂(chang)。它并不属于(yu)GoF(GangofFour)的23种设计模式,但因为其简洁易懂的特性,在实际开发中应用(yong)非常广泛。你可以把它想象成一个“万能的组装师傅”。
简单工厂的核心在于,将对象的创建逻辑封装在一个单独的类(工厂类)中。客户端(duan)只需要告诉工厂(chang)它想要什么“产品”,工厂就会根据“指令”返回相应的具体产品对象。
假设我们要开(kai)发一(yi)个图形绘制系统,可以绘制圆形、方形和三角形。
传统方式(无工(gong)厂)://客户端代码Shapeshape;if(type.equals("circle")){shape=newCircle();}elseif(type.equals("square")){shape=newSquare();}else{shape=newTriangle();}shape.draw();
看到了吗?客户端代码需要知道所有具体图形类的存在,并且需要用大量的if-else语句来(lai)判断创建哪个对象。一旦(dan)我们增加一个新的图形(比如椭(tuo)圆),就需要修改这里的代码。
//ShapeFactory.javapublicclassShapeFactory{publicShapegetShape(StringshapeType){if(shapeType==null){returnnull;}if(shapeType.equalsIgnoreCase("CIRCLE")){returnnewCircle();}elseif(shapeType.equalsIgnoreCase("SQUARE")){returnnewSquare();}elseif(shapeType.equalsIgnoreCase("TRIANGLE")){returnnewTriangle();}returnnull;}}//客户端代码ShapeFactoryfactory=newShapeFactory();Shapeshape1=factory.getShape("CIRCLE");shape1.draw();Shapeshape2=factory.getShape("SQUARE");shape2.draw();
封装了创建逻辑:客户端无需关(guan)心(xin)对象的具体创建(jian)过程,只需要调用工厂的静态方法(通常是静态方法,也有(you)非静态的)并传入参数即可。提高了(le)代码的可读性和(he)可维(wei)护性:对象创建的逻辑集中在一个地方,易于修改和维护。降低了客户端(duan)与具体产品类的耦合:客户端只依(yi)赖于工厂(chang)类,而不是具体的产品类(lei)。
工厂类职责过重:当产品种类非常多时,工厂类的if-else或switch语句会变得非常庞大,难以维护。不(bu)符合开闭原则(OCP):每次增加新的产品类型(xing),都需要修改工厂类,这违背了“对扩展开放,对修(xiu)改关闭”的设计原则。
当你的应用中需要创建的对象种类不多,且变化不频繁时。当你希望将对象的创建逻辑集中管理,避免在多个地方重复编写相同的创建代码时。当你希望隐藏对象创建的细节,让客户端代码更简洁时。
简单(dan)工(gong)厂就像一个勤劳的“万能组装师傅”,能够根(gen)据(ju)你的需求快速(su)组装出各种零件。但如果零件种类实在太多,师傅一个人就有点(dian)忙不过来了,而且每次来新零(ling)件(jian),都(dou)得教师傅一遍新做(zuo)法,这就不(bu)太符合“不修改既有代(dai)码就能扩展”的原则了。
别(bie)担心(xin),接下来的“工厂方法”和“抽象工厂”将带来更高级的解决方案,让我们一起进入下一个篇章,看看它们如何应对(dui)更复杂的“生产挑战”!
如果说简单工厂是一位“万能组装师(shi)傅”,那(na)么工厂方法(fa)模式(FactoryMethod)则更(geng)像是“各司其职的专业流水线”。它将创建对象的责任委(wei)托给子类,让每个子类负责创建一(yi)种特定的产品。
工厂方(fang)法模式定义了一个创建对象的接口,但由子类决定实例(li)化哪一个类。换句话说,它允许一个类延迟实例化到子类。工厂方法模式将创建对象的工作“推”给了子类,每个子类实现一个工厂方法,用于创建相应的产品。
我们继续上面的图形绘制系统。这次,我们希望能够轻松地添加新的图形类型,而(er)不需要修(xiu)改现有的代码。
我们定(ding)义一个抽象的ShapeFactory(或称为Creator):
//AbstractShapeFactory.java(Creator)publicabstractclassShapeFactory{//工厂方法,由子类实现publicabstractShapecreateShape();//模板方法,利用工厂方法创建并使用产品publicvoiddrawShape(){Shapeshape=createShape();//委托给子类创建shape.draw();}}
然后(hou),我们为每种图形创建一个具体的工厂类(ConcreteCreator):
//CircleFactory.java(ConcreteCreator)publicclassCircleFactoryextendsShapeFactory{@OverridepublicShapecreateShape(){returnnewCircle();}}//SquareFactory.java(ConcreteCreator)publicclassSquareFactoryextendsShapeFactory{@OverridepublicShapecreateShape(){returnnewSquare();}}//TriangleFactory.java(ConcreteCreator)publicclassTriangleFactoryextendsShapeFactory{@OverridepublicShapecreateShape(){returnnewTriangle();}}
//客户端代码ShapeFactoryfactory=newCircleFactory();factory.drawShape();//创建并绘制圆形ShapeFactoryfactory2=newSquareFactory();factory2.drawShape();//创建并绘制方形
符合开闭原则(OCP):当需要添加新的产(chan)品类型时,只需要(yao)创建一个新的具体工厂类,而无需修改已有的工厂类和(he)客户端代码。这极大地提高了代码的可扩展性。实现了创建与使用分离:客(ke)户端代码与具体产品类和具体工(gong)厂类分离(li),提高了(le)代码的灵活性。单一职责原则:每个具体工厂类只负责创建一种产品。
类的(de)数量增加:每增加一(yi)种产品,就需要增加一个具体的工厂类。当产品种类非常多时,类的(de)数量可能会急剧增加,带来一定的管(guan)理负担(dan)。引入了额外的(de)复杂(za)度:相对于简单工厂,工厂方(fang)法(fa)模式引入了抽象工厂和具体工(gong)厂的概念(nian),需要更深入的理解。
当一个类不知道它需要创建的对象的具体类时。当一个类希望由其子类来创建对象时。当你希望通过引入新的子类来扩展框架的(de)功能,而无需修改框架的核心代码时。
工厂方法就像是为每一种产品都配备了一台专属的、高度自动化的生产线。这样做的好处是,当你想要生产新产(chan)品时,只需要“上线”一条新的生产线即可,而不会干扰到现有的生产。虽然初(chu)期需(xu)要为每种产(chan)品设计一条生产线,但长远来看,这会大大提高生产效率(lv)和系统的可维护性。
在经历了“万能组(zu)装(zhuang)师傅”和“专属生产流水线”之后(hou),我们终于迎(ying)来了工厂模式的“集大成者”——抽象工厂模(mo)式(AbstractFactory)。如果说工厂方法是生产单一产品线的专家,那(na)么抽象工厂则是一个“家族式”的生产专家,它能(neng)够(gou)生(sheng)产一系列相关联的产品。
抽(chou)象(xiang)工厂模(mo)式提供一个创建一系列相关或依赖(lai)对象的接口,而无(wu)需(xu)指定它们的具体类。它通过定义一系列抽象的“工厂方法”,让具体的工厂类负责实现这些(xie)方法,从而创建一系(xi)列具体的产(chan)品。
想象一下,我们要开发一个跨平台的GUI工具包,需要支持Windows和Mac两种风格的界面。每(mei)种风格的界面都有相应的按钮、文本框和复选框。
//AbstractButton.javainterfaceButton{voidrender();}//AbstractTextBox.javainterfaceTextBox{voidrender();}//AbstractCheckBox.javainterfaceCheckBox{voidrender();}
//WindowsButton.javaclassWindowsButtonimplementsButton{@Overridepublicvoidrender(){System.out.println("RenderingWindowsButton");}}//MacButton.javaclassMacButtonimplementsButton{@Overridepublicvoidrender(){System.out.println("RenderingMacButton");}}//...其他产品(pin)的具体实现(TextBox,CheckBox)
接着,我们定义抽象工厂接口,其中包含创建各种产品(pin)的工厂方法:
//GUIFactory.java(AbstractFactory)interfaceGUIFactory{ButtoncreateButton();TextBoxcreateTextBox();CheckBoxcreateCheckBox();}
创建具体的工厂类,每个工厂类负(fu)责生产(chan)一种(zhong)风格的产品家族:
//WindowsFactory.java(ConcreteFactory)classWindowsFactoryimplementsGUIFactory{@OverridepublicButtoncreateButton(){returnnewWindowsButton();}@OverridepublicTextBoxcreateTextBox(){returnnewWindowsTextBox();//假设已实现}@OverridepublicCheckBoxcreateCheckBox(){returnnewWindowsCheckBox();//假设已实现}}//MacFactory.java(ConcreteFactory)classMacFactoryimplementsGUIFactory{@OverridepublicButtoncreateButton(){returnnewMacButton();}@OverridepublicTextBoxcreateTextBox(){returnnewMacTextBox();//假设已实现}@OverridepublicCheckBoxcreateCheckBox(){returnnewMacCheckBox();//假设已实现}}
客户端代码只(zhi)需选择对应的工厂,就可以获得一组协调一致的产品:
//客户端代码GUIFactoryfactory=newWindowsFactory();//或者newMacFactory();Buttonbutton=factory.createButton();TextBoxtextBox=factory.createTextBox();CheckBoxcheckBox=factory.createCheckBox();button.render();textBox.render();checkBox.render();
强制组合一致性:抽象工厂确保了创建的产品是相互兼容的,因为它们都来自同一个工厂。这有助于避免因为产品组合不当而产生的错(cuo)误。易于替换产品家族:当需要更换整个产品家族(例如,从Windows风格切换到Mac风格)时,只需要更换(huan)具体的工厂类即可,而无需修改客户端代码。
封装了产品族的创建过程:客户端代码与具体产品类和具体工厂类(lei)分离。
难以添加新的产(chan)品类型:如果需要在(zai)产品家族中添加新的产品(pin)类型(例如(ru),增加一个“菜单”组件),就需要修改抽象工厂接口,并要求所有具体的工厂类都实现新的工厂方法。这(zhe)会破坏开闭原则。类的数量增加:同样,产品种类越多,工厂类和产品类的数量也会越多。
当一个系统不依赖于用户创建产品,而只依赖于产(chan)品的具体(ti)类时。当一(yi)个系统需要一(yi)系列相关联的(de)产品对象,并且这些产品对象必须一起使用时。当你想提供一个产品库,但又不想暴露(lu)其内部实现,并且希望(wang)允(yun)许用户选择(ze)这个库的一个具体实现时。当需要创建跨平台的应用程序时。
抽象工厂就(jiu)像是一个“生产家族”的总(zong)代理。它负责协调和管理整个产品家族的生(sheng)产,确保生产出来的产品(比如同一风格的按钮、文本框、复选(xuan)框)能够完美地协同工作。当你想要切换到另一个“家族”(比(bi)如切换界面风格),只需要换一个(ge)总代理即可。唯一的挑战是,如(ru)果这个家族突(tu)然要增加一个全新的(de)产品种类,那所(suo)有的总代理和生产线(xian)都得跟着更新,这有点(dian)反(fan)“易扩展”的原则。
简单工(gong)厂:“万能组装师傅”,代码简洁,适合产品种类不多且变化不频繁(fan)的场景。缺点是工厂职责过重,不符合开闭原则。工厂方法:“专属生产流水线”,将创建逻(luo)辑委托(tuo)给子类,符合开闭原则,可扩展性强(qiang)。缺点是类的数量可能增(zeng)多。抽象工(gong)厂:“家族式(shi)生产流水线”,创建一系列相关联的产品,保证了产品族的一致性。
这“三驾马车”各有千秋,选择哪种模式,取决于你(ni)的具体业务需求和对系统(tong)可扩(kuo)展性的要求(qiu)。理(li)解(jie)它们的原(yuan)理和应用场景,能帮助我们写出更加灵活、健壮、易于维护的代码,让你的程序真(zhen)正拥有“工厂般”的效(xiao)率(lv)和智慧!希望这篇文章能让你对这几种(zhong)工厂模式有了更清晰的认识。
2025-11-03,比安卡怎么看原视频,嘉泽新能(601619)2名股东合计质押2.28亿股,占总股本9.38%
1.向日葵视频下载罗志祥,腾讯控股授出2393.6万股奖励股份站长统计丝瓜,先导智能业绩引爆!固态电池概念股震荡上扬,宁德时代涨超10%,智能电动车ETF(516380)盘中拉升4.7%
图片来源:每经记者 陈乙熙
摄
2.抖音快手闪现录屏在线看网站+埃及猫视频原版高清观看,暴涨!A股重大信号:居民存款“搬家”
3.百分之百露奶头下载+楼rzUdDhYpivec楼lofter,创新投教形式 长城基金“金融安全”宣讲走进社区国防科普展
永久免费 54看片在线观看+快手私人订制定制舞蹈app,资产配置首选股票!险资下半年展望来了
《《卻望1973》娃娃脸》-HD中字免费播放-1080p-好心思影院
封面图片来源:图片来源:每经记者 名称 摄
如需转载请与《每日经济新闻》报社联系。
未经《每日经济新闻》报社授权,严禁转载或镜像,违者必究。
读者热线:4008890008
特别提醒:如果我们使用了您的图片,请作者与本站联系索取稿酬。如您不希望作品出现在本站,可联系金年会要求撤下您的作品。
欢迎关注每日经济新闻APP