`
844604778
  • 浏览: 551484 次
文章分类
社区版块
存档分类
最新评论

玩转工厂模式

阅读更多

最近在看《headfirst 设计模式》,发现简单工厂,工厂模式,抽象工厂模式这三者的区别于联系不是太好理解,经过研究之后,写几个例子,加深一下印象。

上一篇介绍了简单工厂模式,《玩转简单工厂模式》,下面再写一个工厂模式的例子

package go.derek;
//这是一个抽象工厂类
public abstract class CarFactory{
	abstract void brand();
	abstract Car create(String type);
}
//宝马工厂,继承了抽象工厂类
class BmwFactory extends CarFactory{
	public void brand(){
		System.out.println("这是宝马工厂,采用 宝马 指定配件与制造工艺");
	}
	//宝马的工厂方法
	public Car create(String type) {
		if(type.equals("745Li")){
			return new Bmw_745Li();
		}
		else if(type.equals("765Li")){
			return new Bmw_765Li();
		}
		else
			return null;
	}
}
//奥迪工厂,继承了抽象工厂类
class AudiFactory extends CarFactory{
	public void brand(){
		System.out.println("这是奥迪工厂,采用 奥迪 指定配件与制造工艺");
	}
	//奥迪的工厂方法
	public Car create(String type) {
		if(type.equals("A8L")){
			return new Audi_A8L();
		}
		else if(type.equals("A6L")){
			return new Audi_A6L();
		}
		else
			return null;
	}
}
//小汽车的抽象类
abstract class Car{
	
	abstract void intro();
}
//宝马745Li
class Bmw_745Li extends Car{
	private String type="Bmw_745Li";
	public void intro(){
		System.out.println("这辆宝马的型号是"+type+"");
	}
}
//宝马765Li
class Bmw_765Li extends Car{
	private String type="Bmw_765Li";
	public void intro(){
		System.out.println("这辆宝马的型号是"+type+"");
	}
}
//奥迪A8L
class Audi_A8L extends Car{
	private String type="A8L";
	public void intro(){
		System.out.println("这辆奥迪的型号是"+type+"");
	}
}
//奥迪A6L
class Audi_A6L extends Car{
	private String type="A6L";
	public void intro(){
		System.out.println("这辆奥迪的型号是"+type+"");
	}
}
package go.derek;
//测试类,模拟客户端调用
public class FactoryTest{
	public static void main(String[] args){
		//创建宝马工厂对象
		CarFactory bmw=new BmwFactory();
		//执行宝马工厂的流程
		bmw.brand();
		//获得指定型号的宝马车
		Car car1=bmw.create("745Li");
		car1.intro();
		Car car2=bmw.create("765Li");
		car2.intro();
		//创建奥迪工厂对象
		CarFactory audi=new AudiFactory();
		//执行奥迪工程的流程
		audi.brand();
		//获得指定型号的奥迪车
		Car car3=audi.create("A6L");
		car3.intro();
		Car car4=audi.create("A8L");
		car4.intro();
	}
}
运行结果如下

这是宝马工厂,采用 宝马 指定配件与制造工艺
这辆宝马的型号是Bmw_745Li
这辆宝马的型号是Bmw_765Li
这是奥迪工厂,采用 奥迪 指定配件与制造工艺
这辆奥迪的型号是A6L
这辆奥迪的型号是A8L

对比上一篇简单工厂设计模式,可以看出,产品Car基本一致,只不过工厂类有了区别,简单工厂是一个工厂生产所有汽车,工厂模式则是一个工厂只生产一种品牌的车。显然如果有很多品牌,很多型号的车的话,依赖关系要比简单模式简单的多,扩展起来也方便的多。


分享到:
评论

相关推荐

    环保大数据玩转地球.docx

    环保大数据玩转地球 作者:刘国伟 来源:《环境与生活》 2019年第8期 据赛迪智库近日公布,2019年上半年,我国大数据产业增长势头强劲,大数据相关企业已增至5637家,预计2019年我国大数据产业规模将达到7200亿元。...

    Java架构面试专题汇总

    高并发,高可用,海量数据,没有分布式的架构知识肯定是玩不转的: 分布式架构原理 分布式架构策略 分布式中间件 分布式架构实战 四、微服务架构 业务越来越复杂,服务分层,微服务架构是架构升级的必由之路

    传智播客扫地僧视频讲义源码

    15_玩转多级指针_传智扫地僧 16_两个辅助指针变量挖字符串测试框架搭建 18_作业 源码及文档 01_课程回顾 02_两个赋值指针变量挖字符训练_第3种内存模型_传智扫地僧 03_多级指针的野指针问题(释放问题)_传智扫地僧 ...

    world2:[DEPRECATED]在原world上重新架构新的形式的百科系列应用

    一系列类应用:幽默笑话,玩转英语,星座星语 ... 使用说明 创建keystore 定义属性storepass, keypass, alias的值,写入文件keystore.properties,配合keystore生成APK 执行各工程下的build.sh,编译出对应的APK 分...

    Java版水果管理系统源码-Forward:Java+Android知识体系+Jetpack系列详解+MVVM实战(补充中......)

    玩转View:View的绘制原理、各种自定义View; 动画系列:熟悉View动画和属性动画的不同点,懂属性动画的工作原理; 懂性能优化、熟悉mat等工具 懂点常见的设计模式 推荐书籍 《Android开发艺术探索》 《Android群英...

    Doom 1.3:像在上帝模式下的第一人称射击游戏一样飞过 3D 场景-matlab开发

    当他玩他最新的自我射手时,你有没有看过你半成年的儿子的肩膀? 您是否希望他在 Matlab 中以比您以往任何时候都更快的速度直观地探索 3D 数据 - 使用您的老式“缩放”、“平移”和“旋转”按钮? 下一代工程师将...

    C#编程大作业基于Unity游戏引擎的2D闯关游戏源码+sln解决方案+项目说明.zip

    基于单例设计模式实现转场动画; 设计并实现了游戏的核心机制和规则,如玩家属性和道具系统,包括生存机制和道具收集与使用等; 通过不同的关卡动态调整游戏难度,确保游戏的平衡性和挑战性。 ## 角色: 创建多个...

    EditPlus V3.51 build 1036 中文版

    * 允许选择工程 INI 文件 ('管理工程'->'工程 INI 文件') * 工具栏按钮 '更多最近的文件' <错误修正> * 拆分窗口导致程序崩溃 * TR1 正则表达式错误导致内存泄露 * 粘贴命令不工作, 如果剪贴板文本为不可用的 ...

    java俄罗斯方块游戏

    遵循软件工程的知识,从软件问题定义开始,接着进行可行性研究、需求分析、概要设计、详细设计,最后对软件进行了测试,整个开发过程贯穿软件工程的知识体系。 此次设计在Microsoft Windows XP系统下,以Java为开发...

    Lorenzo-Il-Magnifico:软件工程我的项目-Java 8中的多客户端服务器在线基于PC的棋盘游戏Lorenzo Il Magnifico,摆动式GUI,套接字和RMI网络

    现在,您将被要求插入模式连接和用户界面,将它们插入,然后就可以开始玩了! 注意:您可以通过转到它来修改最大玩家数。polimi.ingsw.ps19.constant.NetworkConstants并将MAXPLAYERS常量修改为最多5个(以激活第五...

    课程设计-基于Unity游戏引擎的2D闯关游戏源码+sln解决方案(直接打开).zip

    基于单例设计模式实现转场动画; 设计并实现了游戏的核心机制和规则,如玩家属性和道具系统,包括生存机制和道具收集与使用等; 通过不同的关卡动态调整游戏难度,确保游戏的平衡性和挑战性。 ## 角色: 创建多个...

    .NET平台上的文件抽取框架toxy.zip

    ParserFactory是工厂模式类,负责所有解析器的实例化工作,它会根据传入文件的扩展名自动寻找合适的解析器。下面展示一下PDF文档的抽取代码,一样极其简单:123string path = TestDataSample.GetPdfPath("Sample1....

    退让

    几天后,我稍微玩了一下DynamoDB,想了解一些有关错误处理的知识,并发现了这篇文章: ://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html# 我意识到这两篇文章都在谈论相同的...

    Excel终极伴侣1.286

    一个小巧而又十分强大的Excel加载项(插件)---OBS.DLL,大小1M左右,却能突破微软的技术壁垒,打破Excel的常规应用模式,开辟了Excel的另类应用空间。加载后新增一个"OBS"工具条,适用于Excel2002及以上版本,推荐在...

    Excel终极伴侣1.287

    一个小巧而又十分强大的Excel加载项(插件)---OBS.DLL,大小1M左右,却能突破微软的技术壁垒,打破Excel的常规应用模式,开辟了Excel的另类应用空间。加载后新增一个"OBS"工具条,适用于Excel2002及以上版本,推荐在...

    Excel终极伴侣1.291

    一个小巧而又十分强大的Excel加载项(插件)---OBS.DLL,大小1M左右,却能突破微软的技术壁垒,打破Excel的常规应用模式,开辟了Excel的另类应用空间。加载后新增一个"OBS"工具条,适用于Excel2002及以上版本,推荐在...

    Excel终极伴侣1.288

    一个小巧而又十分强大的Excel加载项(插件)---OBS.DLL,大小1M左右,却能突破微软的技术壁垒,打破Excel的常规应用模式,开辟了Excel的另类应用空间。加载后新增一个"OBS"工具条,适用于Excel2002及以上版本,推荐在...

    Excel终极伴侣1.290

    一个小巧而又十分强大的Excel加载项(插件)---OBS.DLL,大小1M左右,却能突破微软的技术壁垒,打破Excel的常规应用模式,开辟了Excel的另类应用空间。加载后新增一个"OBS"工具条,适用于Excel2002及以上版本,推荐在...

    Android项目源码仿微信登录注册聊天换肤二维码扫描.zip

    简单说明一下Eric_JQM_Chat工程目录结构,当初开发的时候初衷只是玩玩openfire实现IM的过程,没想到一写就写了一通,对模块也没有很好的分包,还请多多包涵。 可以脸红的说,基本上所有功能实现都放在第一个eric_...

    Nehe的OpenGL教程电子书

    玩一下其它课程的代码,不要操之过急。最好专心把每一课学好,而不是蜻蜓点水,只知道如何把东西做出来。 8.混合 有理由等一下,一个来自很酷的Hypercosm的程序员伙伴问(我)他是否可以写一章关于混合的教程。...

Global site tag (gtag.js) - Google Analytics