金年会

每日经济新闻
要闻

每经网首页 > 要闻 > 正文

简单工厂、工厂方法和抽象工厂的区别1024工厂-csdn博客

陈庆辉 2025-11-02 21:32:00

每经编辑|陈斯斯    

当地时间2025-11-02,,超黄抖阴2025下载

代码的“生产线”:为何我(wo)们需要工厂模式?

想象一下,你正在经营一家玩具(ju)工厂,你需要生(sheng)产各种各样的玩具(ju):小汽车、芭比娃娃、乐高积木。起初,一切(qie)都很简(jian)单。每当有订单,你直接拿起对应的模具,加工,然后组装。但很快,问题就来了。

随着玩具种类的增多,你的生产流程变得越来越复杂。你需要维护大量的模具,每增加(jia)一种新玩具,就意味着你需要增加一(yi)套新的工具和流程。当客户想要定制一款独一无二的(de)玩具(ju)时,你更是头疼欲裂,因为你需要修改现有的生产(chan)线(xian),这不(bu)仅耗时,还可能影(ying)响其他玩具的生产。

在软件开发的世界里,我们常常面临类似的问题。当我们创建对象时,如果直接在代码中(zhong)硬编码对象的创建逻辑,会带来一系列的麻烦:

紧耦合:客户端代码直接依赖(lai)于具体的产品类,一旦产品类(lei)发生变化,客户端代码也必须随之修改。这就像你的玩具订单系统直接连接到每一个玩(wan)具的生产流程,改一个螺丝都(dou)需要改整个系统。可扩展性差:想要增加新的产品类型?那你可能需要修改大量(liang)创建对象的代码,这无疑是“牵一发而动全身”。

代码冗余:相似的对象创建逻辑可能会在代码中反复出现,导致代码重复,难以维护。

工厂模式,正是为了解决这些痛点而诞生的“神器”。它就像是为你的代码建造了一条高效、灵(ling)活的“生产(chan)线”,将对象的创建过程与客户端代码解耦,让你的程序更加健壮、易于扩展和维护。今天(tian),我们就来深(shen)入了解一下工(gong)厂模式的“三驾马车”:简单工厂、工厂方法和抽象工厂,看看它(ta)们各自有什么绝活!

简单工厂——“万能的组装师傅”

简单(dan)工厂,顾名(ming)思义,就是一种“简(jian)单”的工厂。它并不属于GoF(GangofFour)的23种设计模式,但因(yin)为其简洁易懂的特性,在实际开发(fa)中应用(yong)非常广(guang)泛。你可以把它想象成一个“万能的组(zu)装师傅”。

它的核心思想是什么?

简单工厂的核心在(zai)于,将对象的创建逻(luo)辑封装在一个单独的类(工厂类)中。客户端只需要告诉工厂它想要什么“产品”,工厂就(jiu)会根据“指令”返回相应的(de)具体(ti)产品对象。

场景举例:

假设我(wo)们要开发一个图形绘(hui)制系统,可以绘制圆形、方形和三角(jiao)形。

传统方(fang)式(无工厂)://客户端代码Shapeshape;if(type.equals("circle")){shape=newCircle();}elseif(type.equals("square")){shape=newSquare();}else{shape=newTriangle();}shape.draw();

看到了吗?客户端代码需要知道所有(you)具体图形类的存在,并且需要用大量的if-else语句来判断创建哪个对象。一(yi)旦我们增加一个新的图形(比如(ru)椭圆),就需要修改这里(li)的代码。

使用简单工厂:

我们创建一个ShapeFactory类:

//ShapeFactory.javapublicclassShapeFactory{publicShapegetShape(StringshapeType){if(shapeType==null){returnnull;}if(shapeType.equalsIgnoreCase("CIRCLE")){returnnewCircle();}elseif(shapeType.equalsIgnoreCase("SQUARE")){returnnewSquare();}elseif(shapeType.equalsIgnoreCase("TRIANGLE")){returnnewTriangle();}returnnull;}}//客户端代(dai)码ShapeFactoryfactory=newShapeFactory();Shapeshape1=factory.getShape("CIRCLE");shape1.draw();Shapeshape2=factory.getShape("SQUARE");shape2.draw();

简单工厂的优点:

封装了创建逻辑:客户端无需关心对象的具体创建过程,只需(xu)要调用工厂的静态方法(通常是静态方法,也有非静态的)并传入参数即可。提高了代码(ma)的可读性和可维(wei)护性(xing):对象(xiang)创建的逻辑集中在一个地方(fang),易于修改和维护。降低了客户端与具体(ti)产品类的耦合:客户端只依赖于工厂类,而不是具体的产品类。

简单工厂的缺点:

工厂类职责过重:当(dang)产品种类非常多时,工厂类的if-else或switch语句会变得非常庞大,难以维护。不符合开闭原则(OCP):每次增加新的产品类型,都需要修改工厂类,这违背了“对扩展开放,对修改关闭”的(de)设计原则。

简(jian)单工(gong)厂的应用场景:

简单工厂非常适合在以下场景使用:

当你的(de)应(ying)用中需(xu)要(yao)创建的对象种(zhong)类不多,且变化不频繁时。当你希望将对象的创建逻辑集中管理,避免在多个地方重复编写相同的创建代码时。当(dang)你希(xi)望隐藏(cang)对象创建的细节,让客户端代码更简洁时。

简单工厂(chang)就像一个勤劳的“万能组装师傅”,能够根据你的需求快速组装出各种零件。但如果零件种(zhong)类实在太多,师傅一个人就(jiu)有点忙不过来了,而且每次来新零件,都得教师傅(fu)一遍新做法,这就不太符合“不修改既有代码就能扩展”的原则了。

别担心,接(jie)下来的“工厂方法”和“抽象工厂”将带来更高级的解决方案,让我们一起进入下一个篇章,看看它们如何应对更复杂的“生产挑战”!

工厂方法——“各司其职的专业流水线”

如果说简(jian)单工厂是一位“万能组装师傅”,那么工厂方法模式(FactoryMethod)则更像是“各司其职的专业(ye)流水线”。它将创建对象的责任委托给子类,让每个子类负责创建一种特(te)定的产(chan)品。

它的核心思想是什么?

工厂方法模式定义了一个创建对象的接口,但由子类决(jue)定实例化哪一个类。换句话说,它允许一个类延迟(chi)实例化到子类。工厂方法模式将创建对象的工作“推”给了子类,每个子类实现一个(ge)工厂(chang)方法,用于创建相应的(de)产品。

场景举例:

我们继续上面的图(tu)形绘制系统。这次,我们希望能够轻松地添加新的图形类型,而不需要修改现有的代码。

使用工厂方法模式:

我们定义(yi)一个抽象的ShapeFactory(或称(cheng)为Creator):

//AbstractShapeFactory.java(Creator)publicabstractclassShapeFactory{//工厂方(fang)法,由子类实现publicabstractShapecreateShape();//模板方法,利用工厂(chang)方法创建并使用产品publicvoiddrawShape(){Shapeshape=createShape();//委托给子类(lei)创建shape.draw();}}

然后,我们为每种图形创(chuang)建一个具体的工厂类(ConcreteCreator):

//CircleFactory.java(ConcreteCreator)publicclassCircleFactoryextendsShapeFactory{@OverridepublicShapecreateShape(){returnnewCircle();}}//SquareFactory.java(ConcreteCreator)publicclassSquareFactoryextendsShapeFactory{@OverridepublicShapecreateShape(){returnnewSquare();}}//TriangleFactory.java(ConcreteCreator)publicclassTriangleFactoryextendsShapeFactory{@OverridepublicShapecreateShape(){returnnewTriangle();}}

客户端代码现在变得非(fei)常(chang)简(jian)洁:

//客户端代码ShapeFactoryfactory=newCircleFactory();factory.drawShape();//创建(jian)并绘制圆(yuan)形(xing)ShapeFactoryfactory2=newSquareFactory();factory2.drawShape();//创建并绘制方形

工厂方法(fa)模式的优点:

符合开闭原则(OCP):当需要添加新的产品(pin)类型时,只(zhi)需要创建一(yi)个新的(de)具体工厂类,而无需修改已有的工厂类(lei)和(he)客户端代码。这极大地提高了代码的可扩展性。实现了创建与使用分离:客户端代码与具体产品(pin)类和具体工厂类分离,提高了代码的灵活性。单一职责(ze)原(yuan)则:每个具体工厂类只负责创建一(yi)种产(chan)品。

工厂方法模式的缺点:

类的数量增加:每增加一种产品,就需(xu)要增加一个具体的工厂类。当产品种类非常多时,类的数量可能会急剧增加,带来一定的(de)管理负担。引入了额外的复(fu)杂度:相对于简单工厂,工厂方法模式引入了抽象工厂和具体工厂的概念,需要更深入的理解。

工厂方法模式的应用场景:

工厂方法模式非常适合(he)在以下场景使用:

当一个类不知道它需要创建的对象的具体类时。当一个类希望由其子类来创建对象时。当你希(xi)望通(tong)过引入新的子类来(lai)扩展框架的功能,而无需修改(gai)框架的核心(xin)代码时。

工厂方法就像是(shi)为每一种产品都配备了一台专属的、高度自动化的生产线。这样做的好处是,当你想要生产新产品时,只需要“上线”一条新的生产线即可,而不会干扰到现有(you)的生产。虽然初期需要为每种(zhong)产品设计一条(tiao)生产线,但长远来看,这会大大提高生产效率(lv)和系统的(de)可维护性。

抽象(xiang)工厂——“家(jia)族式生产流水线”

在经历了“万能组装师傅”和“专属生产流水线”之后,我们终于迎来了工厂模式的“集大成者”——抽象工厂模(mo)式(AbstractFactory)。如果说工厂方法是生产单一产品线的专家,那么抽象工厂则是一个“家族式”的生产专家,它能够生产一系列相关联的产品。

它的核心思想是什么?

抽象工厂模式提供一个创建一系列相关或依赖对象的接口,而无需指定它们的具体类。它通过(guo)定义一系列抽象的“工厂方法”,让具体的工厂类负责实现这些方法,从而创建(jian)一系列具体的产品。

场景举例:

想象一下,我们要开发一个跨平(ping)台的GUI工具包,需要支持Windows和Mac两种风格的界面。每种风格的界面都有相应的按钮、文(wen)本框和复选框。

使用抽象工厂模式:

我们首先定义一系列抽象产品接口:

//AbstractButton.javainterfaceButton{voidrender();}//AbstractTextBox.javainterfaceTextBox{voidrender();}//AbstractCheckBox.javainterfaceCheckBox{voidrender();}

然后,为每种平(ping)台创建具体的产(chan)品实现:

//WindowsButton.javaclassWindowsButtonimplementsButton{@Overridepublicvoidrender(){System.out.println("RenderingWindowsButton");}}//MacButton.javaclassMacButtonimplementsButton{@Overridepublicvoidrender(){System.out.println("RenderingMacButton");}}//...其他产品的具体实现(TextBox,CheckBox)

接着,我(wo)们(men)定义抽象工厂接口,其中包(bao)含创建各种产品的工厂方(fang)法:

//GUIFactory.java(AbstractFactory)interfaceGUIFactory{ButtoncreateButton();TextBoxcreateTextBox();CheckBoxcreateCheckBox();}

创建具体的工厂类,每个工厂类负责生产一种风格的产品(pin)家族:

//WindowsFactory.java(ConcreteFactory)classWindowsFactoryimplementsGUIFactory{@OverridepublicButtoncreateButton(){returnnewWindowsButton();}@OverridepublicTextBoxcreateTextBox(){returnnewWindowsTextBox();//假设已实现}@OverridepublicCheckBoxcreateCheckBox(){returnnewWindowsCheckBox();//假设已实现}}//MacFactory.java(ConcreteFactory)classMacFactoryimplementsGUIFactory{@OverridepublicButtoncreateButton(){returnnewMacButton();}@OverridepublicTextBoxcreateTextBox(){returnnewMacTextBox();//假设已实现}@OverridepublicCheckBoxcreateCheckBox(){returnnewMacCheckBox();//假设已实现}}

客户(hu)端代码只需选择对应的工厂,就可以获得一组协调一致的产品:

//客户端代码GUIFactoryfactory=newWindowsFactory();//或者newMacFactory();Buttonbutton=factory.createButton();TextBoxtextBox=factory.createTextBox();CheckBoxcheckBox=factory.createCheckBox();button.render();textBox.render();checkBox.render();

抽象(xiang)工厂(chang)模式的优点:

强制组合一致性:抽象工厂确保了创建的(de)产品是相互(hu)兼容的,因为它们(men)都来自同一个工厂。这有助于避(bi)免因为产品组合不当而产生的错误。易于替换产品家族:当需要更换整(zheng)个产品家族(例如,从Windows风(feng)格切换到Mac风格)时,只需要更换具体(ti)的工厂类即可,而无需修改客户端代码。

封装了产品(pin)族的(de)创建过程:客户端代码与具体产品类和具体工厂类分离。

抽象工厂模式的缺点:

难以添加新的产品类型:如果需要在产品家族中添加新的产品类型(例如,增加(jia)一个“菜单”组件),就(jiu)需要修改抽象工(gong)厂接口,并要求所有具体的工厂类都实现新的(de)工(gong)厂方法。这会破坏(huai)开闭原则。类的数(shu)量增加(jia):同样,产品种类越多,工厂类和产品类的数(shu)量也会越多(duo)。

抽象工厂模式的应用场景:

抽象工厂(chang)模(mo)式非常适合在以下(xia)场景使用:

当(dang)一个系统不依赖于用户创建产品,而只依赖于产品的具体类时。当一个系统需要一系(xi)列相关联(lian)的(de)产品对象,并且这些产品对象必须一起使(shi)用时。当你想提供一个产品库,但又不想暴(bao)露其内部实现,并且希望允(yun)许用户选择这个库的一个具体实现时。当需要创建跨(kua)平台的应用程序(xu)时。

抽象工厂就像是一个“生产家族”的总代理。它负责协调和管理整个产品家(jia)族的生产,确保生产出来(lai)的产(chan)品(pin)(比如同一风格的(de)按钮、文本框、复选框)能够完美地协同(tong)工(gong)作。当你想要切换到另一个“家族(zu)”(比如(ru)切换界面风格),只需要换一个总代理即可。唯(wei)一的(de)挑战是,如果这个家族突然要增加一个全新的产品种类,那所有的总代理和(he)生产线都得跟着更新,这有点反“易扩展”的原则。

总结:三驾马车,各显神通

简单工厂:“万能组装师傅”,代码简洁,适合产品种类不(bu)多且变化不频繁的场景。缺点是工厂职责过重,不符合开闭原则。工厂(chang)方法:“专属生产流水线(xian)”,将创建逻辑委托给子类,符合开闭原则,可扩展性强。缺点是类的数量可能增(zeng)多。抽象工厂:“家族式生产流水线”,创建一系列相关联的产品,保证了(le)产品族的一致性。

缺(que)点是添加新产品类型比较困难。

这“三驾马车”各有千秋,选择哪种模式,取决于你的具体业务需求和对系统可扩(kuo)展性的要求。理解它们的原理和应用场景,能帮助我们写出更加灵活、健(jian)壮、易于维护(hu)的代码,让你的程序真正拥有“工厂般”的(de)效率和智(zhi)慧!希望这篇文章能让你对这几种(zhong)工厂模式有了(le)更清(qing)晰的认识。

现在,就去你的代(dai)码里实(shi)践一下吧!

2025-11-02,太久tal9a,拜加密货币之赐 特朗普家族的净值在几周内增加13亿美元

1.杨晨晨的土豪定制视频内容,长城基金汪立:“AI+”行动蓝图出炉,关注中长期发展机会李毅动态第400期动态更新时间,刚刚,A股又诞生一只千元股,股价一个月接近翻倍

图片来源:每经记者 陈星 摄

2.最新色网站17吃瓜+gogogo高清在线完整怎么开,李想:特别喜欢北京,来北京时候前所未有的开心

3.涩色视频+美女口活好爽,美国债务首超37万亿,市场对降息持乐观预期

qqclivevip十年沉淀2023最新版特色+黄色标志软件下载大全303,刚刚!美联储,突爆大消息!

三角洲骇爪同人原版漫画-三角洲骇爪同人原版漫画最新版N.29.68.69

封面图片来源:图片来源:每经记者 名称 摄

如需转载请与《每日经济新闻》报社联系。
未经《每日经济新闻》报社授权,严禁转载或镜像,违者必究。

读者热线:4008890008

特别提醒:如果我们使用了您的图片,请作者与本站联系索取稿酬。如您不希望作品出现在本站,可联系金年会要求撤下您的作品。

欢迎关注每日经济新闻APP

每经经济新闻官方APP

0

0

Sitemap