设计模式之工厂方法模式一
简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背“开闭原则”,如何实现增加新产品而不影响已有代码?这就引出了我要写的这篇博客---工厂方法模式
场景:现在需要生产不同的电子设备,其中的产品有笔记本,手机。其中的生产过程不能暴漏给用户,当然用户只需要的是最终的产品,并不关系这些电子设备是怎么创建出来的。
解决方法一:简单工厂方法:
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程序设计要复习了,考试完接着写****************************
上一篇: 设计模式 之 工厂模式
下一篇: 设计模式——工厂模式