深入浅出设计模式中文版第03章_第1页
深入浅出设计模式中文版第03章_第2页
深入浅出设计模式中文版第03章_第3页
深入浅出设计模式中文版第03章_第4页
深入浅出设计模式中文版第03章_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第03章:简单工厂模式——轻松实现对象的创建与管理在设计软件时,我们常常会遇到这样一个问题:如何在不暴露创建逻辑的情况下创建对象?简单工厂模式为我们提供了一种解决方案。本章将带领大家深入了解简单工厂模式,学会如何轻松地实现对象的创建与管理。一、简单工厂模式的定义简单工厂模式(SimpleFactoryPattern),又称静态工厂方法模式,它属于创建型模式。在简单工厂模式中,我们定义一个工厂类,根据传入的参数来创建并返回不同类型的对象。这样,客户端只需知道需要哪个产品,而无需关心产品的创建过程。二、简单工厂模式的结构1.工厂类(Factory):负责实现创建所有产品实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。2.抽象产品类(Product):定义产品的接口,是所有产品类的父类。3.具体产品类(ConcreteProduct):实现抽象产品类定义的接口,具体的产品类。三、简单工厂模式的实现步骤下面我们通过一个实例来讲解简单工厂模式的实现步骤:假设有一个手机生产工厂,可以生产苹果手机(ApplePhone)和安卓手机(AndroidPhone)。1.定义抽象产品类——手机类(Phone)publicabstractclassPhone{publicabstractvoidproduce();}2.定义具体产品类——苹果手机类(ApplePhone)和安卓手机类(AndroidPhone)publicclassApplePhoneextendsPhone{Overridepublicvoidproduce(){System.out.println("生产苹果手机");}}publicclassAndroidPhoneextendsPhone{Overridepublicvoidproduce(){System.out.println("生产安卓手机");}}3.定义工厂类——手机工厂类(PhoneFactory)publicclassPhoneFactory{publicstaticPhonecreatePhone(Stringtype){Phonephone=null;if("apple".equals(type)){phone=newApplePhone();}elseif("android".equals(type)){phone=newAndroidPhone();}returnphone;}}4.客户端调用publicclassClient{publicstaticvoidmain(Stringargs){Phonephone=PhoneFactory.createPhone("apple");if(phone!=null){duce();}}}四、简单工厂模式的优点1.解耦性强:客户端与具体的产品类实现解耦,客户端只需知道所需产品的类名或参数即可,无需关心产品类的具体实现。2.易于维护:由于所有产品的创建逻辑都集中在工厂类中,当需要增加新的产品时,只需修改工厂类,而无需修改客户端代码,降低了系统复杂性和维护成本。3.简化客户端调用:客户端无需知道产品类的创建过程,只需通过工厂类提供的静态方法即可获取产品实例,简化了客户端的调用。五、简单工厂模式的缺点尽管简单工厂模式有许多优点,但它也存在一些不足之处:1.扩展性差:当需要增加新的产品时,必须修改工厂类的代码,违反了开闭原则(对扩展开放,对修改关闭)。2.工厂类职责过重:随着产品类的增多,工厂类中的逻辑会变得复杂,导致工厂类过于庞大,难以维护。3.不利于继承:简单工厂模式通常使用静态方法,这使得工厂类无法通过继承的方式进行扩展。六、简单工厂模式的应用场景1.产品种类较少:当产品种类较少,且不会频繁增加时,使用简单工厂模式可以简化对象的创建过程。2.客户端不关心产品的创建过程:客户端只需知道如何使用产品,而不关心产品的具体实现。3.工厂类逻辑简单:当工厂类的创建逻辑较为简单,不会导致工厂类过于庞大时,可以考虑使用简单工厂模式。八、简单工厂模式的实际案例为了让大家更好地理解简单工厂模式,我们来看一个生活中的实际案例:披萨店。想象一下,你走进一家披萨店,店里有各种口味的披萨,如margherita、pepperoni和BBQ。你只需要告诉服务员你想要什么口味的披萨,而不需要知道披萨是如何制作的。//抽象产品类interfacePizza{voidprepare();voidbake();voidcut();voidbox();}//具体产品类classMargheritaPizzaimplementsPizza{publicvoidprepare(){//}publicvoidbake(){//}publicvoidcut(){//}publicvoidbox(){//}}classPepperoniPizzaimplementsPizza{publicvoidprepare(){//}publicvoidbake(){//}publicvoidcut(){//}publicvoidbox(){//}}//工厂类classPizzaStore{publicPizzaorderPizza(Stringtype){Pizzapizza=null;if(type.equals("margherita")){pizza=newMargheritaPizza();}elseif(type.equals("pepperoni")){pizza=newPepperoniPizza();}//其他产品创建逻辑pizza.prepare();pizza.bake();pizza.cut();pizza.box();returnpizza;}}在这个例子中,`PizzaStore`类扮演了工厂的角色,根据客户的需求(`type`参数)来创建并返回相应的`Pizza`对象。客户无需关心披萨是如何制作的,只需享受美味的披萨。九、简单工厂模式的变体在实际应用中,简单工厂模式可以根据具体需求进行一些变体。例如,我们可以将工厂类的方法设置为静态的,这样就不需要创建工厂类的实例,直接通过类名调用静态方法即可。这种变体在某些情况下可以进

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论