设计模式学习笔记三:工厂方法模式

DesignPattern 设计模式学习笔记(面试和工作必备) 最近有很多粉丝留言:“学设计模式有什么用啊,好像我工作中都用不到设计模式,但每次面试都要问实际项目中使用了哪些设计模式,我都答不上来。” 面对这样的问题,我想说设计模式真的很重要。曾经我也认为学设计模式没什么用,但用过了都说好。所以,猿人花了一个星期的时间给大家整理了最常用的设计模式,通过源码和文档的形式分享给大家。 希望大家认真学习掌握,真正学以致用。不仅面试时要对答如流,实际工作中也要加以应用,这样能力才会得到提升。 一、设计模式介绍 设计模式(Design pattern)代表了最佳的实践,通常被有经 阅读详情

上篇文章讲到了简单工厂模式(Factory method)

本人将按照上篇文章的场景继续讨论,若想了解请移至:http://blog.youkuaiyun.com/array7/article/details/38499739。

场景只是为了引申出主题,不具有实际意义,请谅解业务逻辑不完整之处,以后可能会再进行润色,咱只是不希望把一个模式说的没有依据。

    随着公司领导有方与同事努力奋斗,公司的业绩越来越好,不同的业务线有了新的变化,以满足公司的长足发展。

        机票组细分为了国内机票、海外机票;

        酒店组细分了国内酒店、海外酒店;

        门票组细分了景点门票、赛事门票;

        度假组细分了......


    这个时候我们发现,现有的系统需要在业务层面上继续分离,在系统结构上也需要有所变动。也就是说我们要修改系统达到这样一个目的,根据同一个产品的不同类型创建订单,而订单的创建则有是一个具体的工厂的创建。我们还是用原来的订单控制中心,只不过把订单创建延迟到子类中进行。


代码如下:

1、订单中心,现在变成了抽象类,将creteOrder方法移回来并变成抽象方法。

/* 
 * OrderProcessCenter.java 1.0 2014/08/11 
 *  
 * 声明:欢迎转载,请注明出处。 
 *  
 */  

package com.array7.facotry_method;
/**
 * 订单中心,负责对所有类型的订单进行控制
 * @author array7
 *
 */
public abstract class OrderProcessCenter {
	public Order orderFlow(String type) {
//		Order order = new SimpleOrderFactory().createOrder(type);
		Order order = this.createOrder(type);
		order.pay();
		order.notifyCustomer();
		order.finish();
		return order;
	}
	
	public abstract Order createOrder(String type);
}

2、具体的工厂继承上面的订单中心类,实现指定类型的订单工厂:

package com.array7.facotry_method;

public class ChinaOrderProcessCenter extends OrderProcessCenter{

	@Override
	public Order createOrder(String type) {
		Order order = null;
		if ("air".equals(type)) {
			order = new ChinaAirOrder();
		} else if ("hotel".equals(type)) {
			order = new ChinaHotelOrder();
		} else if ("ticket".equals(type)) {
			order = new ChinaTicketOrder();
		} else if ("xxx".equals(type)) {
			// TODO: some thing
		} else if ("yyy".equals(type)) {
			// TODO: some thing
		} else if ("zzz".equals(type)) {
			// TODO: some thing
		} else if ("123".equals(type)) {
			// TODO: some thing
		}
		return order;
	}

}

package com.array7.facotry_method;

public class ForeignOrderProcessCenter extends OrderProcessCenter{

	@Override
	public Order createOrder(String type) {
		Order order = null;
		if ("air".equals(type)) {
			order = new ForeignAirOrder();
		} else if ("hotel".equals(type)) {
			order = new ForeignHotelOrder();
		} else if ("ticket".equals(type)) {
			order = new ForeignTicketOrder();
		} else if ("xxx".equals(type)) {
			// TODO: some thing
		} else if ("yyy".equals(type)) {
			// TODO: some thing
		} else if ("zzz".equals(type)) {
			// TODO: some thing
		} else if ("123".equals(type)) {
			// TODO: some thing
		}
		return order;
	}

}


3、创建具体的订单:

package com.array7.facotry_method;

public class ChinaAirOrder extends Order{
	public ChinaAirOrder() {
		System.out.println("create a ChinaAirOrder...");
	}
}

package com.array7.facotry_method;

public class ChinaHotelOrder extends Order{
	public ChinaHotelOrder() {
		System.out.println("create a ChinaHotelOrder...");
	}
}

package com.array7.facotry_method;

public class ChinaTicketOrder extends Order{
	public ChinaTicketOrder() {
		System.out.println("create a ChinaTicketOrder...");
	}
}

package com.array7.facotry_method;

public class ForeignAirOrder extends Order {
	@Override
	public void pay() {  // 覆盖了支付方式,使用visa以支持国际支付
		System.out.println("VISA paid...");
	}
}

package com.array7.facotry_method;

public class ForeignHotelOrder extends Order {
	public ForeignHotelOrder() {
		System.out.println("create a ForeignHotelOrder...");
	}
	
	@Override
	public void pay() {  // 覆盖了支付方式,使用visa以支持国际支付
		System.out.println("Visa paid...");
	}
}

package com.array7.facotry_method;

public class ForeignTicketOrder extends Order {
	public ForeignTicketOrder() {
		System.out.println("create a ForeignTicketOrder...");
	}
}


4、OK,至此我们的订单逻辑已经完成,下面下2张单测试一下:

package com.array7.facotry_method;

public class Test {
	public static void main(String[] args) {
		// 创建一个国内酒店订单
		OrderProcessCenter chinaOrderCenter = new ChinaOrderProcessCenter();
		chinaOrderCenter.orderFlow("hotel");
		// 创建一个国外订单
		OrderProcessCenter foreignderCenter = new ForeignOrderProcessCenter();
		foreignderCenter.orderFlow("hotel");
	}
}

输出:

create a ChinaHotelOrder...
paid...
done...
finished...
create a ForeignHotelOrder...
Visa paid...
done...
finished...

输出正常,是我们想要的结果。从此码农们可以专心搞一个模块了。业务也清晰了。每个业务线都能独立处理自己的逻辑。简单工厂模式的时候,我们是无法选择国内或者国外等类型的,而在订单中心中我们可以选择使用哪种工作生产产品。


文章仅供个人学习记录,有不到之处还请指正。


后续会慢慢润色力求精准全面。




ComfyUI安装包运行前准备:增加虚拟内存 在Windows系统中,虚拟内存是一种重要的系统资源管理机制,它主要通过将硬盘空间用作内存来扩展系统的可用内存容量。以下是虚拟内存的主要作用: 1. 扩展物理内存容量 当物理内存(RAM)不足时,系统会将一部分数据从内存转移到硬盘上的虚拟内存区域(也称为“分页文件”或“交换文件”)。这样可以为正在运行的程序提供额外的“内存空间”,确保系统能够继续运行,而不会因为内存不足而崩溃。 2. 提高系统稳定性 虚拟内存为系统提供了一个缓冲区。如果没有虚拟内存... 阅读详情

相关推荐

别急着让AI画板!聊聊Cadence Allegro X AI和OrCAD X在实际PCB项目中的真实体验

本文分享了Cadence Allegro X AI与OrCAD X在PCB设计中的实际应用体验,探讨了AI辅助Layout的效率提升与潜在陷阱。通过高速ADC采集板案例,详细对比了AI与传统方法在电源平面分割、低速信号布线等任务中的表现,并总结了人机协作的最佳实践,为工程师提供实用参考。

weixin_30836759的博客 2232

Android设计模式之一个例子让你彻底明白工厂模式(Factory Pattern)

提出疑问这几天研究工厂模式的时候,看到网上的一些文章中举的例子我就很疑惑,我相信这也是许多人的疑惑:工厂模式的功能就是创建实例,我们创建实例直接new不就完了吗,干嘛还得再封装一层工厂类,然后用工厂类再去new出这个实例?这不多此一举吗?比如我看到这样的例子,我们的用户分为金牌用户和银牌用户,我们要创建一个金牌用户或者银牌用户。定义一个用户接口public interface ICustomer {

阿拉灯神灯的专栏 1万+

从零开始编写一个上位机(串口助手)QT Creator + C++

提示:本博客作为学习笔记,有错误的地方希望指正,此文可能会比较长,作为学习笔记的积累,希望对来着有帮助。   绪论:笔者这里使用的是QTCreator和C++来实现一个简单的串口上位机的开发的简单过程,使用到C++,主要是为了后面使用Python开发上位机打下基础。这里主要分为初识C++的一些基本知识,其次是QT Creator的使用。特别声明感谢【北京迅为】嵌入式学习之QT学习篇的学习视频,这里的学习笔记就是根据视频中的内容实战记录下来的。 文章目录一、C++知识1、初识C++2、C++输入输出控制2.1

believe666的博客 4万+

别再只调LSTM参数了!试试用pmdarima自动定阶ARIMA,和PyTorch模型做个“搭档”

本文探讨了如何结合pmdarima自动定阶ARIMA与PyTorch构建的LSTM模型,以提升时间序列预测的准确性。通过残差补偿、特征增强和概率融合三种方案,实现比单一模型强大30%的预测效果,特别适用于电商销量预测和服务器负载监控等场景。

weixin_30561425的博客 433

告别连接难题:Windows 11下Multisim主数据库稳定运行终极配置指南

本文详细解析了Windows 11下Multisim 14.0主数据库连接失败的三大根源,并提供了四步终极解决方案,包括系统环境优化、软件权限配置、注册表修复和网络验证绕过技巧。通过实测数据对比,本方案显著提升了启动速度和稳定性,解决了电子仿真中的常见连接问题。

weixin_33738555的博客 436

中移物联ML307C模组OPENCPU开发环境搭建全攻略

本文详细介绍了中移物联ML307C模组OPENCPU开发环境搭建的全过程。从OPENCPU模式的核心优势解析,到SDK获取、Python与scons工具安装,再到解读SDK目录结构与实战编译命令,最后提供常见问题避坑指南,帮助开发者快速构建高效的物联网应用编译环境。

weixin_29168393的博客 748

C# 设计模式之工厂方法模式

C# 设计模式之工厂方法模式

鲤籽鲲的博客 1321

SpringCloud2025+SpringBoot3.5.0+gateway+webflux子服务路由报503

本来昨天就应该也记录下,免得忘记的,但是有点晚了,酒没写,真的是被坑惨了。当然这也是追求最新的代价,也是对新技术、老知识点的重温。依赖更粒度让架构的知识面更高,需要非常清楚另外说不定是有新的负载均衡要出现了,就想当初loadbalancer取代Ribbon一样好了,真是坑了半夜,昨晚都没有写,今天才复盘,希望能帮到大家,让更多在坑里的技术人爬出来。

zwrlj527的专栏 1998

C#设计模式学习笔记:(2)工厂方法模式

本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7567880.html,记录一下学习过程以备后续查用。 一、引言 接上一篇C#设计模式学习笔记:简单工厂模式(工厂方法模式前奏篇),通过简单工厂模式的了解,它的缺点就是随着需求的变化我们要不停地修改工厂里 面的方法的代码,需求变化越多,里面的if–else也越多,这样就会造成简单工厂的实现逻辑过于复杂。 依设计原则里的开闭原则--对增加代码开放,对修改代码关闭,我们不能总是这样修改简单工厂里面的方法。 下面看看工

chinaherolts2008的博客 202

计算机考研常见面试题

写在前面 本人参加20考研,由于复试没有具体要求会问哪几门课,所以我就找了网上一些常见的计算机专业的面试题,整理如下 主要结构: 数据库 软件工程 操作系统 计算机组成原理 计算机网络 数据结构 C++ Java 数据库 1、数据:数据库中存储的基本对象。 数据库:长期存储在计算机内的、有组织的、可共享的数据集合。 数据库管理系统:专门用于建立和管理数据库的一套软件。对外部程序提供访问数据库的方法,对内进行数据管理。 数据库系统:与和数据库相关的整个系统,一般由数据库、数据库管理系统、应用程序、数

qq_38841618的博客 2万+

PyTorch深度学习实战(1)——神经网络与模型训练过程详解

在本节中,我们将了解传统机器学习与人工神经网络间的差异,并了解如何在实现前向传播之前连接网络的各个层,以计算与网络当前权重对应的损失值;实现反向传播以优化权重达到最小化损失值的目标。并将实现网络的所有关键组成——前向传播、激活函数、损失函数、链式法则和梯度下降,从零开始构建并训练了一个简单的神经网络。

盼小辉丶的博客 9万+

设计模式——工厂方法模式

《Head First 设计模式》 学习笔记,码云同步更新中 如有错误或不足之处,请一定指出,谢谢~ 往期回顾 设计模式——策略模式 设计模式——装饰者模式 设计模式——观察者模式 设计模式——简单工厂 设计模式——工厂方法模式 工厂方法模式(Factory Method Pattern) 定义: 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。 工厂方法让类把...

TrZoey的博客 555

微信小程序流量主提升ecpm的一些方法

ecpm就是千次广告曝光收入,是一个预估的价格,而不是额定的,他是随着曝光度,用户点击度,页面访问数来决定的。

任聪聪的博客 1万+

Golang学习笔记_28——工厂方法模式

工厂方法模式(Factory Method)是一种创建型设计模式,它提供了一种创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式让类的实例化推迟到子类中进行。

LuckyLay的博客 1097

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android开发学习笔记之设计模式——工厂方法模式&抽象工厂模式

文章目录Android开发学习笔记之设计模式——工厂方法模式&抽象工厂模式简单工厂模式概述应用场景优缺点实现工厂方法模式概述应用场景优缺点实现抽象工厂模式概述应用场景优缺点实现总结 Android开发学习笔记之设计模式——工厂方法模式&抽象工厂模式 创建型模式的主要特点是“将对象的创建和使用分离”对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离,隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。为了使软件的结构更加清晰,外界对于这些对

qq_36425800的博客 396

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【学习笔记】设计模式 - 工厂方法模式

参考:《重学 Java 设计模式:实战工厂方法模式》 工厂方法模式,图片来自 refactoringguru.cn 工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。 这种设计模式也是 Java 开发中最常见的一种模式,它的主要意图是定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。 简单说就是为了提供代码结构的扩展性,屏蔽每一个功能类中的具体实现逻辑。让外部可以更加简单的只是知道调用即可,同

LawssssCat的博客 448

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【设计模式学习笔记】工厂方法模式

工厂方法模式又称为工厂模式(哈?!(´⊙ω⊙`)),也叫虚拟构造器(Virtual Constructor)模式或者多态工厂模式(Polymorphic Factory),在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实例化(创建)哪一个类。  文章目录            1.1 定义...

Roger_CoderLife的博客 192

设计模式-工厂方法模式学习笔记

工厂方法模式 定义 工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。 优缺点 优点: 相比简单工...

weixin_30340745的博客 78

java23种设计模式-工厂方法模式

工厂方法模式属于创建型设计模式,定义一个创建对象的接口,但让子类决定实例化哪一个类。将类的实例化操作延迟到子类,是面向对象设计中"开闭原则"的典型体现。

专注后端开发 1235

设计模式学习笔记

保证某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。通过一个工厂类来集中管理对象的创建逻辑,客户端无需直接实例化具体类,实现对象创建与使用的解耦。简单工厂模式是工厂模式的一种。定义了一个创建对象的抽象方法,由子类决定要实例化的类。将对象的实例化推迟到子类。每个子类都可以实现工厂接口以提供具体的对象实例化过程提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式允许客户端在不指定具体类的情况下,创建一系列的产品对象。

陈暗暗的博客 1149

Java学习笔记——第九章 设计模式篇

Java学习笔记

朝闻道 1028

设计模式之禅学习笔记——工厂方法模式

工厂方法模式 一、定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 二、类图 三、通用模板代码 ...

weixin_42348609的博客 211

图说设计模式:工厂方法模式

工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。工厂方法模式又称为工厂模式,它属于类创建型模式。

cf18862344377的博客 620

小傅哥《重学JAVA设计模式》学习笔记(一):创建者模型之工厂方法模式

小傅哥《重学JAVA设计模式》学习笔记

qq_40150620的博客 275

设计模式学习笔记(2)——创建型——工厂方法模式

工厂方法模式(Factory Method Pattern)定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。 优点: 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程; 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则; 缺点: 每增加一个产品,就要新增一个对应的工厂类和产品类,增加系统的复杂度 角色: 抽象工厂(Abstract Fac

qq_18846873的博客 249

工厂方法模式(学习笔记)

1. 概念 设计模式主要分为三大类型:(1)创建型模式;(2)结构型模式;(3)行为型模式。其中,工厂方法模式属于创建型模式。以下是工厂方法模式的定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类。 工厂方法模式的特点是让父类在不知道产品接口具体实现子类的情况下,完成产品接口对象的创建,具体的实现选择延迟到工厂方法类的子类中进行。工厂方法的本质就是延迟到工厂方法类的子类来选择实现“产品接口需要的产品子类对象”。 工厂方法模式中的工厂方法

凡江林的博客 320
上一篇: 设计模式学习笔记二:简单工厂模式
下一篇: 设计模式学习笔记四:责任链模式
七郎
博客等级 码龄14年 31粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值