在简介一文的最后,提到了一个简单工厂模式,但是它并不属于23种设计模式之一,可能是它太过于简单,又或者是它具有以下一些不足:在简单工厂模式中,只提供了一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。 简单工厂模式最大的缺点是当有新产品要加入到系统中时,必须修改工厂类,加入必要的处理逻辑,这违背了 “ 开闭原则” 。
在简单工厂模式中,所有的产品都是由同一个工厂创建,工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度高,严重影响了系统的灵活性和扩展性,而工厂方法模式则可以很好地解决这一问题。
一、工厂方法模式动机
来看一个例子:某电视机厂专为各知名电视机品牌代工生产各类电视机,当需要海尔牌电视机时只需要在调用该工厂的工厂方法时传入参数 “ Haier” ” ,需要海信电视机时只需要传入参数“ “ Hisense” ” ,工厂可以根据传入的不同参数返回不同品牌的电视机。
这个按之前的简单工厂模式来设计相信对大家来说不是什么难事了。问题的关键在于简单工厂模式的局限性,这样,每次增加一个产品的时候,如长虹电视,就需要修改工厂类的代码,这违背了“开闭原则”。
现在对该系统进行修改,不再设计一个电视工厂类来统一负责所有产品的创建,而是将具体产品的创建过程交给专门的工厂子类去完成 ,我们先定义一个抽象的电视产品工厂类 ,再定义具体的工厂类来生产海信电视、海尔电视、长虹电视等 ,它们实现在抽象电视产品工厂类中定义的方法。这种抽象化的结果使这种结构 可以在不修改具体工厂类的情况下引进新的产品 ,如果出现新的电视产品类型,只需要为这种新类型的电视产品创建一个具体的工厂类就可以获得该新电视产品的实例,这一特点无疑使得工厂方法模式具有超越简单工厂模式的优越性,更加符合“开闭原则”。
二、工厂方法模式定义
工厂方法模式 (Factory Method Pattern) 又称为工厂模式,也叫 虚拟构造器 (Virtual Constructor) 模式或者 多态工厂 (Polymorphic Factory) 模式 ,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
三、工厂方法模式的结构
工厂方法模式包含如下角色:
• Product :抽象产品
• ConcreteProduct :具体产品
• Factory :抽象工厂
• ConcreteFactory
四、模式分析
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。 在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。 这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得 工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品 。
当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体产品对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端, 很好地符合了“开闭原则” 。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。 工厂方法模式退化后可以演变成简单工厂模式。
五、实例(参见第一部分的模式引用,电视产品那个)
1、创建电视产品抽象类(接口)
public interface TVProduct { public void play(); }2、创建生产电视产品对象的抽象工厂类(接口)
public interface TVFactory { public TVProduct produceTV(); }3、创建具体的电视产品子类(HaierTV)
public class HaierTV implements TVProduct{ public void play() { System.out.println("This is HaierTV!"); } }4、创建专门负责生产HaierTV对象的具体工厂子类(HaierTVFactory)
public class HaierTVFactory implements TVFactory { public TVProduct produceTV(){ return new HaierTV(); } }5、创建客户端类进行测试
public class Test { public static void main(String args[]){ //声明一个工厂类对象yvf TVFactory tvf; //声明一个TV类对象tvp TVProduct tvp; //创建具体子工厂对象,并向上转型给父类工厂对象tvf tvf = new HaierTVFactory(); //父类对象通过向上转型后而到对象去调用produceTV()方法,生产出具体的产品对象 tvp = tvf.produceTV(); //产品对象调用自己的play()方法 tvp.play(); } }6、模式优势
通过以上五点,我们用工厂方法模式设计了一个模拟电视产品的场景,现在假设我们需要更改电视产品,不再使用海尔(即第5点中的HaierTVFactory对象),而是需要改成海信电视,此时,我们只需要创建一个具体的海信电视类(HisenseTV),让其继承TVProduct类,并重写父类的play()方法,同时再创建一个负责生产HisenseTV类对象的具体工厂(HisenseTVFactory)即可,具体可看以下代码:
public class HisenseTV implements TVProduct{ public void play(){ System.out.println("This is HisenseTV!"); } }
public class HisenseTVFactory implements TVFactory{ public TVProduct produceTV(){ return new HisenseTV(); } }
创建好新的产品子类和工厂子类后,我们再来看第5点的Test.java中的代码,可以发现,此时我们只需要改tvf = new HaierTVFactory();这一行代码,将HaierTVFactory()改成HisenseTVFactory()即可。如果使用java的反射机制和XML文档的结合,还可以这么写:
tvf = (PayMethodFactory)XMLUtil.getBean(); //getBean()的返回类型
这样一来只需要修改XML中的名字,连java文件都不需要改动,很好的符号了“开闭原则”。
谢谢您的关注和阅读,文章不当之处还请您不吝赐教~~~
相关推荐
这个是http://blog.csdn.net/dawanganban/article/details/9884681博客中java设计模式的源代码。下载前请先看《设计模式——工厂模式在开发中的应用》一文。
**设计模式——简单工厂模式** 简单工厂模式是创建型设计模式的一种,它提供了一种创建对象的最佳方式。在简单工厂模式中,一个专门的类(称为工厂类)负责创建对象,客户端无需知道所创建的对象的具体类,只需要...
简单工厂模式,也称为静态工厂模式,是一种创建型设计模式,它提供了一个静态方法来创建对象,而无需暴露实例化逻辑。在简单工厂模式中,一个单一的工厂类负责生产所有相关类型的实例。这种模式适用于产品种类较少且...
Android之大话设计模式——:抽象工厂模式借鉴.pdf
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体类。这种模式的主要目的是为了隔离产品对象的创建和使用,使得系统对产品类的依赖降低到最低,同时也方便了产品的扩展和...
此 时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许 系统不修改工厂类逻辑的情况下来添加新产品,这样也就克服了简单工厂模式中缺点。下面看下工厂模式 的具体实现...
在学习和应用抽象工厂模式时,理解其核心思想——封装变化和解耦,以及如何在实际项目中选择合适的场景使用这一模式,是非常关键的。对于软件工程专业的学生来说,掌握这一模式不仅可以提升编程能力,还能提高对软件...
《设计模式——GFour》是一本深受IT从业者喜爱的经典书籍,尤其在C++开发者中具有广泛影响力。设计模式是软件工程领域中的一种最佳实践,它总结了在特定情境下解决问题的常见方法,使得代码可读性更强,复用性更高,...
Java设计模式——工厂设计模式详解 在软件设计中,工厂设计模式是一种常用的设计模式,主要用于实例化有共同接口的类。Java设计模式——工厂设计模式是Java中的一种常用的设计模式,主要用于实例化有共同接口的类。...
Android之大话设计模式——:抽象工厂模式参考.pdf
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。刘伟先生在讲解设计模式时,通常会深入浅出地介绍这些模式的原理、应用场景以及如何有效地在实际编程中应用它们。设计模式并不是...
简单工厂模式是软件设计模式中的一种基础模式,它属于创建型模式,主要解决对象的创建问题,降低了客户端代码与具体产品类之间的耦合度。在本实验中,我们将深入理解和应用C#语言实现简单工厂模式。 简单工厂模式的...
### 设计模式——基于C#的工程化实现及扩展 #### 概述 本书旨在向读者展示如何利用C# 2.0语法有效地实现和应用设计模式,使其不仅仅局限于简单的例子,而是能够在实际工程项目中发挥重要作用。全书分为七个部分,...
本文实例讲述了Python设计...设计模式——工厂方法模式 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延时到其子类. 工厂方法模式克服了简单工
设计模式是一种在软件设计中被广泛认可的解决特定问题、经过良好记录并可重用的解决方案。它们代表了在各种编程环境中反复出现的问题的最佳实践。原版的设计模式通常指的是最初由“Gang of Four”(GoF)在他们的...
《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...
**工厂模式**是一种常见的设计模式,属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,当我们创建对象时,不会直接实例化具体类,而是通过一个工厂类来生产所需的对象。这种模式的核心在于封装了对象...