工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法模式的对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
工厂方法模式角色与结构
抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。
抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。
具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。
某具体产品有专门的具体工厂创建,它们之间往往一一对应。
工厂方法模式的应用
工厂方法经常用在以下两种情况中:
第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
示例代码:
抽象产品角色:
public interface Car {
public void drive();
}
具体产品角色:
public class BMWCar implements Car{
public void drive() {
System.out.println("驾驶了一辆宝马汽车");
}
}
public class QQCar implements Car{
public void drive() {
System.out.println("驾驶了一辆QQ汽车");
}
}
抽象工厂角色:
public interface CarFactory {
public abstract Car getCar();
}
具体工厂角色:
public class BMWCarFactory implements CarFactory{
public Car getCar() {
return new BMWCar();
}
}
public class QQCarFactory implements CarFactory{
public Car getCar() {
return new QQCar();
}
}
测试代码:
public class Client {
public static void main(String[] args) {
CarFactory bmwFactory = new BMWCarFactory();
Car bmwCar = bmwFactory.getCar();
bmwCar.drive();
CarFactory qqFactory = new QQCarFactory();
Car qqCar = qqFactory.getCar();
qqCar.drive();
}
}
分享到:
相关推荐
完成了,但感觉这也没啥特别的,程序界面黑布隆冬的,内部结构也是最最平常的面向对象,于是我应用了《大话设计模式》这本书中的第一个模式——简单工厂模式,看上去还不错。界面的话,也就是输出的语句变了,system...
"C++设计模式第一天"的教程旨在为学习者提供对设计模式的基础认识,从而踏上C++进阶之旅。本课程涵盖了设计模式的核心概念,以及如何在实际项目中应用这些模式。 设计模式是经过时间和实践验证的解决方案,用于解决...
课程中还将深入讲解四种创建型设计模式:简单工厂模式、工厂方法模式、抽象工厂模式和原型模式。这些模式主要处理对象的创建,帮助解耦代码,使得对象的创建过程更加灵活和可扩展。 简单工厂模式提供一个工厂类来...
本书的主要内容为:优化代码的第一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器...
本书的主要内容为:优化代码的第一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器...
Spring框架学习资料第一天 一、Spring框架简介 * Spring框架是在2003年兴起的一门轻量级的JAVAEE框架技术 * Spring框架的诞生目的是致力于全面的简化JAVAEE企业级应用的开发 * Spring框架采用了很多的设计模式:...
本项目包为vue项目,从vue小白到高手,从一个内容管理网站开始实战开发第八天的项目包,项目包中使用的是netcore实现了工厂模式数据库生产,依赖注入、linq、EF等技术。项目组要是提供vue项目从小白到高手的课程学习...
### Spring培训笔记第一天:深入理解Spring框架的核心概念与实践 #### Spring框架简介 Spring框架是企业级应用开发中广泛使用的轻量级框架,它通过提供一系列的开发模式和最佳实践来简化Java应用的开发过程。...
- **场景解析**:在与MM相处的过程中,可以记录下一些重要的时刻,例如第一次见面的日子、第一次约会的地点等。这些记录就像是一个个备忘录,当需要回忆时,就可以通过它们来重新体验那些美好的瞬间。 - **模式...
第一天的课程内容主要介绍了解决方案设计理念,包括软件设计方法的比较,MSF(Microsoft Solution Framework)流程概述,以及软件架构设计的基本思想。课程中还提到了微软服务器产品和桌面产品的集成特性,强调了...
- **第一步**:用户发起请求到达前端控制器DispatcherServlet。 - **第二步**:DispatcherServlet通过处理器映射器HandlerMapping查找合适的处理器(Controller)。 - **第三步**:处理器映射器返回一个执行链...
2. **工厂模式**:提供一个接口用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。C#中的抽象工厂和简单工厂可以用来动态地创建对象,增加了代码的灵活性。 3. **建造者模式**:将一个复杂对象的构建...
2. **工厂模式**:配合策略模式使用,通过工厂方法创建不同的策略对象。例如,可以建立一个策略工厂类,根据传入的影片类型参数返回相应的费用计算策略对象。 3. **装饰者模式**:适用于增加或改变现有功能的行为,...
例如,使用工厂模式改进对象创建过程,或者利用观察者模式实现松耦合的事件处理。此外,书中可能还介绍了如何在重构过程中避免破坏现有的功能,确保软件的稳定。 提到.MVC(Model-View-Controller)框架,它是.NET...
总结,我们会选择第一种方式,因为spring的存在就是要消除工厂模式,因为工厂本身就会在每次调用时new出对象,只是把new的工作换了个地方而已。bean作用域singleton prototype;bean作用域request session global...
在这一部分中,你将了解到Spring框架的基本概念和使用方法,并通过实例探讨了Spring IoC的控制反转和简单工厂模式。 该资源主要包含以下内容(项目文件实例和注释齐全可以帮助你理): Spring框架简介:对Spring...
在PFD培训中,第一天的内容涵盖了PFD的基础理论和实践,包括课堂讲解和实践活动,以帮助学员理解和绘制流程图,查找过程中的细节问题。 失效模式及效应分析(Failure Mode and Effects Analysis, FMEA)是一种前瞻...
例如,在中国的保定市项目中,街景工厂利用800张图像,在一个GPU上仅用1.5天的时间就完成了三维模型的处理工作,充分展示了其高效性和实用性。 #### 四、总结 街景工厂(Street Factory)作为一款先进的三维模型生产...
1. **一对一映射**:例如用户与订单的关系,一个用户可以有多个订单,而一个订单只能属于一个用户。 2. **一对多映射**:例如订单与订单详情的关系,一个订单可以包含多个商品项。 3. **多对多映射**:例如商品与...
第一天,我被分配到受话器组,主要任务是处理产品的次品和废品,以及进行一些杂务工作。工资按日计算,多劳多得。然而,工作的艰辛超乎我的想象,第一天仅剪了900个次品,得到的报酬只有22.5元,这让我意识到这份...