java工厂方法模式记录日志_Java小白如何初步掌握java设计模式之工厂模式!

工厂模式是JAVA中最常用的设计模式之一,使用工厂模式后,创建对象的时候不在将创建逻辑暴露给客户端,而是通过实现接口的方式创建对象,这种设计模式也是对象实例化的最佳方式。

推荐下我自己的Java学习群:515675832,不管你是小白还是大牛,小编我都挺欢迎,不定期分享干货,包括我自己整理的一份2017最新的Java资料和零基础入门教程,欢迎初学和进阶中的小伙伴。

概述

工厂模式的三种形态简单工厂(Simple Factory)

工厂方法(Factory Method)

抽象工厂(Abstract Factory)

简单工厂

简单工厂模式属于工厂模式的小弟,未被收纳进GOF 23中,但是也被频繁使用3a9f4cc048bf2ea9b461193a3c9788a0.png

创建一个Animal接口1b7e842e2666aaaf509d32b8d876eb48.png

2.创建Dog和Pig实现Animal接口4f9e6e738955dc47e3293345c22158b2.png

3.创建工厂类SimpleFactory,定义一个基于参数信息实例化具体对象的方法

3c4f68c825b2d5e6d4648612c484d0de.png

4.日志

0fb685eefaffc1d98528020506442935.png

分析: 从上述代码中可以发现,简单工厂拥有一定判断能力,构建结果取决于入参,使用起来也十分的方便,也正因为使用太过方便而导致高耦合的情况,所有对象实例化都需要依赖它,一旦出问题,影响的会是整个系统

使用场景: 创建简单,无复杂业务逻辑的对象

工厂方法

前面说到过简单工厂模式存在耦合,且违反了开闭原则,那么这一问题在工厂方法模式中可以很容易的解决掉,它可以做到添加新的产品而不破坏已有代码6543856a2c05efdf9583c7f21614e2b5.png

工厂方法模式:定义一个创建对象的接口,由它的实现类来决定具体实现,其模式又被称为工厂模式(Factory Pattern)。

1.新增ImageReaderFactory抽象工厂接口,用来构建具体的对象6f00016b679f2fc1973068abea9df94b.png

2.相比单一实例化的简单工厂模式而言,方法工厂模式更加的灵活,针对不同的产品(图片读取器)提供不同的工厂。2ce8c9bfb6c6d567d6f815568f1d6821.png

21920eede9514e1b07a5b2a68529f2d7.png

3.创建测试类,当然实际使用过程中,实现工厂方法除了可以实例化具体对象,还可以初始化某些资源配置,比如连接池、创建文件等0fa0b68164c15ed84d7213445c9ca0e0.png

4.日志30c6f4a16a16e9e3b2f8ef0daca65e29.png

优点:屏蔽了客户端实例化对象的细节,用户只需要关心自己使用的工厂即可。

加入新的产品(图片读取器),无需更改现有代码,提高系统扩展性,符合开闭原则

具备多态性,又被称为多态工厂模式

缺点: 每次需要编写新的对象和对象工厂类,随业务发展,一定程度上增加了系统复杂度

抽象工厂抽象工厂模式是为创建一组对象提供提供的解决方案,与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建某一种产品,而是负责一组(产品族)。

抽象工厂模式(Abstract Factory Pattern):提供了创建一系列相互依赖对象的接口,无需指定具体类

抽象工厂模式是围绕着一个超级工厂工作,创造其它的工厂类,也被称为工厂的工厂,这种类型的设计模式是创造性的模式,因为这种模式提供了创建对象的最佳方法之一。

起源

抽象工厂模式的起源或者最早的应用,是用于创建分属于不同操作系统的视窗构建。比如:命令按键(Button)与文字框(Text)都是视窗构建,在UNIX操作系统的视窗环境和Windows操作系统的视窗环境中,这两个构建有不同的本地实现,它们的细节有所不同。

在每一个操作系统中,都有一个视窗构建组成的构建家族。在这里就是Button和Text组成的产品族。而每一个视窗构件都构成自己的等级结构,由一个抽象角色给出抽象的功能描述,而由具体子类给出不同操作系统下的具体实现。9646ee8d3f40a0c058ef9b5d2e005793.png

可以发现在上面的产品类图中,有两个产品的等级结构,分别是Button等级结构和Text等级结构。同时有两个产品族,也就是UNIX产品族和Windows产品族。UNIX产品族由UNIX Button和UNIX Text产品构成;而Windows产品族由Windows Button和Windows Text产品构成。2878bfa6cda52ab7ff5fafd2126e5729.png

系统对产品对象的创建需求由一个工程的等级结构满足,其中有两个具体工程角色,即UnixFactory和WindowsFactory。UnixFactory对象负责创建Unix产品族中的产品,而WindowsFactory对象负责创建Windows产品族中的产品。这就是抽象工厂模式的应用,抽象工厂模式的解决方案如下图:633ca3b2035bb83062388a60ee9d55c8.png

显然,一个系统只能够在某一个操作系统的视窗环境下运行,而不能同时在不同的操作系统上运行。所以,系统实际上只能消费属于同一个产品族的产品。

在现代的应用中,抽象工厂模式的使用范围已经大大扩大了,不再要求系统只能消费某一个产品族了。因此,可以不必理会前面所提到的原始用意。

需求:开发一款《王者荣耀》,支持多操作系统和多控制方式操作控制和界面控制,并提供相应的工厂类来封装这些类的初始化过程ff6d180be38849762bb8ad9cc45cdd3f.png

创建不同的操作系统接口3c854899e4ea51f8658b19f32771b009.png

2.基于不同操作系统实现控制逻辑dbb73bdfa676eadb3d0caae9fe9a0259.png

3.创建一个工厂类,基于接口分别实现操作控制和界面控制两种方式的工厂

1ace6577b067496f1ed858333b2ba76c.png

663b12a40e3aa7f55509a5d2c85eb00e.png

4.创建《王者荣耀》进行测试0902fa44d5f566684168119af3976788.png

5.日志2175aa854e153d2ba16b1b602b2225f3.png

分析

使用抽象工厂模式来定义的一系列对象通常是相关或相互依赖的,这些产品对象就构成了一个产品族,也就是抽象工厂定义了一个产品族。这就带来非常大的灵活性,切换产品族的时候,只要提供不同的抽象工厂实现就可以了,也就是说现在是以一个产品族作为一个整体被切换,从上文中可以发现,如果我们需要切换控制方式,只需要变更下对应的工厂类即可

优点:分离接口和实现:客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。

切换产品族变得容易:对于增加新的产品族,抽象工厂模式很好地支持了开闭原则,只需要增加具体产品并对应增加一个新的具体工厂,对已有代码无须做任何修改(如:新增一种手柄操作支持)。

缺点:不易扩展新产品:如果需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类(如:新增一种操作系统的支持,那么Factory代码需要全部修改)。

使用场景:一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。

这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。

系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。22c4399c780596683f593f9a75f4f9b6.pngJava学习交流群515675832,不管你是小白还是大牛,不定期分享干货,整理的一份2017最新的Java资料和零基础入门教程,欢迎初学和进阶中的小伙伴。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值