简单工厂模式的缺点就是,每次增加一个具体产品实现类,工厂类就一定要重新修改。工厂方法模式主要是针对简单工厂模式的该问题,给出了解决方法。
工厂方法模式的一般结构,如图所示:
通过上图可以看到,工厂方法具有下面四个不同的角色:
01.抽象工厂角色
02.具体工厂角色
03.抽象产品角色
04.具体产品角色
工厂方法模式各个角色描述如下:
01.抽象工厂角色
抽象工类厂将具体工厂类的实现细节隐藏起来,如果具体工厂实现类发生过变化,对外部客户端的调用没有任何影响。这也说明了工厂类具有多态性,抽象工厂一定不可以实例化,这需要根据具体工厂类的实例来完成产品对象的创建。
因为抽象工厂类中给出了抽象方法,任何具体的工厂实现类都需要继承(或实现)抽象工厂类(或工厂接口)。同样,客户端要求创建产品类的对象,抽象工厂方法执行创建后,返回值为抽象产品类型,客户端已经根据具体的创建要求进行请求了,一定能够知道获取到的对象是哪个具体产品类的对象。
02.具体工厂角色
具体工厂类是依赖于具体的产品的,每一个产品的进行实例化的方式的改变,都将对对应的具体工厂类产生影响。具体工厂类的实现方式发生了改变,是不会对抽象工厂类产生影响的,因为具体工厂类遵守了抽象工厂方法的定义。
诚然,具体工厂类依赖于具体产品类。倘若只有一个具体工厂类,如果具体产品增加或者创建方式改变,简单工厂模式和工厂方法模式还是存在细微的差别的,简单工厂模式中的具体工厂类与工厂方法模式中的抽象工厂都能够屏蔽产品对象的创建,不同的是简单工厂模式中的具体工厂类需要做修改,而工厂方法模式中的抽象工厂不需要修改。
03.抽象产品角色
抽象产品类向任何发出产品对象创建的客户端屏蔽了产品的细节,也就是说,通过抽象工厂类的抽象工厂法获取到的对象具有相同的“外貌”,对每一个客户端是没有任何差别的。
抽象产品类可以使用抽象类或者借口来定义。
04.具体产品角色
具体产品类具有产品对象的数据和服务,客户端通过获取到所需要的产品对象,来完成特定的业务流程。具体产品类的创建方式,对于具体工厂类来说是可见的,具体工厂类也只需要知道具体产品类的创建方式,并且具体产品类是继承(或实现)抽象工厂类的抽象工厂方法中所要求的抽象产品类类型。
工厂方法模式的各个角色已经介绍,下面通过给出实际的类图来描述工厂方法模式如何在实际的系统设计中使用,以此加深理解。
第一种:
这种工厂方法模式的实现,比较具有代表性。
如图可见,抽象工厂类AbstractFactory具有两个具体工厂实现类AirFactory和LandFactory,其中LandFactory负责产品等级结构中具体产品类Train(火车类)和Car(汽车类)对象的创建,这一类产品是抽象产品类Transport(交通工具类)的具体实现类,属于陆地交通工具,我们可以直接将这一类对象的创建在LandFactory中统一管理,如果有增加新的陆地交通工具的需求,创建该新增陆地交通工具具体类类的对象只需要修改LandFactory类,而与AirFactory类无关。同样,出现AirFactory类管理的一类交通工具类对象的创建也不会影响LandFactory类。
第二种:
当系统中除了具有上述形式的工厂方法模式表现的特征外,还存在很多其他的一些单一具体产品类(不像上图给出的那样,产品等级有一定的层次和规模),可以直接使用抽象产品角色退化的形式来实现。
上图具体产品类以命名为“Module”结尾,表示他们属于一类,可以通过一个具体工厂类来创建。如果存在另一组不同的具体产品类,它们的创建需要不同的参数,可以在抽象工厂类中增加另一个抽象工厂方法来作为客户端请求调用的入口,然后具体对应的工厂实现类可以只实现该新增抽象方法。
总结
工厂方式模式最显著的特征就是:
1.比简单工厂方法增加了抽象工厂角色,屏蔽了具体工厂角色的细节。
2.工厂方法模式主要是针对同一个产品等级,工厂方法返回同一种抽象产品类类型。
3.比简单工厂方法更容易扩展产品等级,增加该抽象产品类的一个具体产品类,可以增加一个具体工厂类与之对应,而其它具体工厂类无需改动。
分享到:
相关推荐
工厂方法模式是面向对象设计模式中的行为型模式之一,它提供了一种...在提供的文件列表中,“FactoryMethod”可能是包含这个简单示例代码的文件。如果有机会查看这个文件,将能更深入地理解工厂方法模式的实现细节。
《设计模式之——工厂方法(Factory Method)》 在软件工程中,设计模式是一种解决常见问题的可重用解决方案,它被广泛应用于构建高质量、可维护的代码。工厂方法是面向对象设计模式的一种,属于创建型模式。这个...
C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method)
工厂方法模式与简单工厂模式相比,具有更好的可扩展性。在简单工厂模式中,工厂类通常是静态的,负责创建所有类型的对象,这导致在添加新产品时,需要修改工厂类。而在工厂方法模式中,每种产品都有专门的工厂类负责...
- **简单工厂模式**:工厂方法模式比简单工厂模式更具有扩展性和灵活性,简单工厂模式只有一个静态工厂方法,而工厂方法模式则允许有更多的具体工厂。 - **抽象工厂模式**:工厂方法模式关注单个产品族,而抽象工厂...
设计模式C++学习之工厂方法模式(Factory Method)
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪一个具体类。这样,客户端代码就不需要知道具体的类是什么,只需通过工厂接口获取对象。 工厂...
在软件设计模式中,工厂方法(Factory Method)和抽象工厂(Abstract Factory)是两种非常重要的创建型模式。它们主要用于解决对象实例化的问题,提供了一种封装对象创建过程的方法,使得代码更加灵活,易于扩展和...
工厂方法(Factory Method)是面向对象设计模式中的一个基础且广泛应用的模式,它属于创建型模式,主要目的是为了解耦对象的创建过程。本文将深入探讨工厂方法的设计理念、实现方式及其在实际开发中的应用。 ### ...
### Factory Method 工厂方法模式(创建型模式) #### 概述 在软件工程领域,设计模式是一种在特定上下文中解决常见问题的通用方案。Factory Method(工厂方法)模式是GoF(Gang of Four)设计模式之一,属于创建型...
Factory Method 工厂方法模式(创建型模式).wmv
Java设计模式是面向对象编程...在阅读《Chapter1___Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)》的相关资料时,你可以更深入地学习这些模式的细节,包括适用场景、优缺点以及如何在实际项目中实现。
它们都是由不同的厂家生产的,这就是工厂方法模式(FactoryMethod)与前面所说的简单工厂模式(SimpleFactory)的差别。 实例: 多文档系统。我已经用C#的源码编程了:请下载Factory Method Patter.rar
C#面向对象设计模式纵横谈(5):Factory Method 工厂方法模式(创建型模式) (Level 300)
简单工厂模式中,创建对象的逻辑集中在单个工厂类中,而工厂方法模式则将创建对象的责任分散到多个子类中,使得系统更易于维护和扩展。 总的来说,工厂方法模式在C#中的应用广泛,尤其是在需要灵活地创建不同类型...
通过阅读和分析源文件`FactoryMethod`,我们可以深入理解工厂方法模式的实现细节,例如工厂类如何创建产品对象,产品对象如何通过接口或抽象类进行交互等。这对于学习和应用设计模式,以及提高代码的可维护性和扩展...