简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背“开闭原则”,如何实现增加新产品而不影响已有代码?这就引出了我要写的这篇博客---工厂方法模式
场景:现在需要生产不同的电子设备,其中的产品有笔记本,手机。其中的生产过程不能暴漏给用户,当然用户只需要的是最终的产品,并不关系这些电子设备是怎么创建出来的。
解决方法一:简单工厂方法:
Factory Method是一种常见的类创建型模式,又叫做工厂方法模式或者虚拟构造器模式或者多态工厂模式.
Define an interface for creating an object, but let subclass decide which class to instantiate. Factory Mothod lets a class defer instantiation to subclass.
(在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中,及通过工厂子类决定究竟应该要实例化哪一个具体的产品类)
要解决的问题:
还记得当时学习第一个模式是简单工厂模式,由于在扩展产品类的时候还要修改源代码,破坏了面向对象设计原则中的开闭原则;
于是我用反射的方式扩展了简单工厂具体的实现方法请参考 设计模式之从简单工厂到泛型简单工厂;
我们还有之中更加常规的实现方法就是使用工厂方法模式 , 也就是今天要讨论的设计模式。我们通过继承工厂接口(Factory)给每一种产品创建一个具体工厂(ConcreteFactory),并且我们要做一个抽象产品类,每一种具体的产品类去继承这个产品类。这样上层模块之间相互依赖,下层模块也相互依赖,在具体的编程中可以使用里氏代换原则随意的更换子类,从而达到扩展系统的作用。
模式结构
下面是这个模式结构图如下:
工厂方法模式包含如下几个角色:
1,Product(抽象产品)
抽象产品是定义产品的接口或者抽象类,是工厂方法模式所创建对象的超类型,也就是产品对象的共同父类或者接口。
2,ConcreteProduct(具体产品)
3,Factory(抽象工厂)
在抽象工厂中,声明了用于创建产品对象的工厂方法.抽象工厂是工厂模式的核心,该类可以是抽象类或者接口。
4. ConcreteFactory(具体工厂)
具体工厂类是抽象类的子类,负责创建具体的产品对象。
模式讲解
工厂方法模式是简单工厂模式的进一步抽象和升级。使用了面向对象核心的多态性,保持了简单工厂的优点同时克服了其缺点满足了开闭原则。相比于简单工厂,工厂方法模式的核心工厂类不在负责具体的产品的创建而是讲具体的创建过程交给子类,并不负责具体的创建细节,如果有一种新的产品的需要添加到系统中那么只需要创建一组具体的产品类和对应的具体工厂类就可以了。这种方式是的工厂类和产品类有一种平行的等级结构,上层之间相互依赖。
对应到现实世界,现在生产的产品这两种产品,我有手机生产车间,笔记本生产车间,那么抽象出来就是抽象车间生产抽象产品,而具体的生产车间生产具体的产品。
假
在软件系统中也是同样的道理,我需要打开以前写的代码重新修改里面的创建逻辑,但是学过软件项目管理的都应该知道,在运行中的系统的代码是不要轻易修改的,是要走变更控制的。利用工厂方法模式我们可以利用修改配置文件和添加新类的方式去扩展系统功能。
下面我们看一个非常简单的例子:
抽象工厂类
package com.zdx.design_pattern.factory_method.factory; import com.zdx.design_pattern.factory_method.product.Device; public abstract class DeviceFactory { //定义抽象方法,依赖于Device抽象产品 public abstract Device getDevice(); }
具体工厂类1:
package com.zdx.design_pattern.factory_method.factory; import com.zdx.design_pattern.factory_method.product.Device; import com.zdx.design_pattern.factory_method.product.LapTop; public class LapTopFactory extends DeviceFactory { @Override public Device getDevice() { //制造具体的产品,局部依赖于具体产品 return new LapTop(); } }
具体工厂类1:
package com.zdx.design_pattern.factory_method.factory; import com.zdx.design_pattern.factory_method.product.Device; import com.zdx.design_pattern.factory_method.product.Phone; public class PhoneFactory extends DeviceFactory { @Override public Device getDevice() { return new Phone(); } }
抽象产品类:
package com.zdx.design_pattern.factory_method.product; public interface Device { public void open(); public void close(); }
具体产品类1,
package com.zdx.design_pattern.factory_method.product; public class Phone implements Device { @Override public void open() { System.out.println("phone is opened"); } @Override public void close() { System.out.println("phone is closed"); } }
具体产品类2:
package com.zdx.design_pattern.factory_method.product; public class LapTop implements Device{ @Override public void open() { System.out.println("LapTop is opened"); } @Override public void close() { System.out.println("LapTop is closed"); } }
客户代码:
DeviceFactory factory=new LapTopFactory(); Device device=factory.getDevice(); device.open(); device.close();
****************************未完结,明天要考试Linux程序设计要复习了,考试完接着写****************************
相关推荐
工厂方法模式是设计模式中的创建型模式之一,它在软件工程中扮演着非常重要的角色,尤其是在C#这样的面向对象编程语言中。工厂方法模式提供了一种封装对象创建过程的方法,使得具体的创建过程延迟到子类中进行,从而...
java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式...
工厂方法模式是面向对象设计模式中的一种,它属于创建型模式,主要解决的是当系统需要创建的对象具有多种类型,而具体创建哪种类型的对象在运行时才能确定的问题。在这个压缩包中,`FactoryMethod`可能包含了Java...
简单工厂模式是一种静态工厂方法,它通常包含一个类,该类负责创建其他类的实例。客户端通过调用静态方法获取所需对象,而不必了解具体创建对象的逻辑。虽然简单工厂模式易于理解和实现,但它的缺点在于违反了“开...
工厂模式是一种常用的软件设计模式,它是创建型设计模式的一种,主要解决对象的创建问题,将对象的创建过程封装起来,使得创建过程独立于使用过程。这样可以提高代码的可复用性和灵活性,同时降低了系统的耦合度。...
工厂方法模式是面向对象设计模式中的一个创建型模式,它提供了一种封装对象创建过程的方式,使得具体的对象创建过程可以延迟到子类中进行。在C++编程中,工厂方法模式广泛应用于各种软件设计中,因为它能有效地解耦...
工厂方法模式是设计模式中的创建型模式,它提供了一种创建对象的最佳方式。在这个模式中,一个类(称为工厂类)不再直接实例化具体的产品,而是定义一个接口或抽象类,由子类来决定实例化哪一个类。这样做的好处在于...
工厂方法(Factory Method)是设计模式中的一员,属于创建型模式,它的核心思想是定义一个用于创建对象的接口,让子类决定实例化哪一个类。这个接口就是工厂方法,让子类决定实例化哪一个类,工厂方法让类的实例化...
工厂方法(Factory Method)是面向对象设计模式中的一种,属于创建型模式。它定义了一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法让一个类的实例化推迟到子类。 **概念理解** 1. **工厂角色...
《研磨设计模式之工厂方法模式》是一本深入解析Java设计模式的专业书籍,特别是对工厂方法模式进行了详尽的探讨。设计模式是软件工程中的一种最佳实践,它们是解决常见问题的经验总结,使得代码更加可读、可维护和可...
在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...
根据提供的标题“深入浅出设计模式之工厂模式”与描述“将《Head First 设计模式》(中文版)按章节进行了分割,每章一个文件,方便大家下载”,我们可以推测出这部分内容主要关注的是设计模式中的工厂模式。...
工厂方法模式是面向对象设计中的一种经典设计模式,属于创建型模式。它的主要目的是将对象的创建过程封装起来,使得创建过程独立于使用过程。在Java中,工厂方法模式允许我们定义一个创建对象的接口,但让实现这个...
C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method)
1. **简单工厂模式(Simple Factory)**:这是最基础的工厂模式,它包含一个静态方法,根据传入的参数返回相应的对象实例。这种模式的优点在于客户端代码无需知道如何创建对象,只需知道对象的类型即可。但它的缺点...
"工厂模式"是其中一种常用的设计模式,它提供了一种创建对象的最佳方式。在这个主题下,我们将深入探讨三种主要的工厂模式:简单工厂、工厂方法和抽象工厂。 1. **简单工厂模式**: 简单工厂模式是最基础的形式,...