一、概述

  上一节[简单工厂模式]介绍了通过工厂创建对象以及简单的利弊分析;这一节来看看工厂方法模式对类的创建

  工厂方法模式:

    工厂方法与简单工厂的不同,主要体现在简单工厂的缺点的改进:

    工厂类不再负责产品的创建,工厂角色变成了抽象工厂的角色(工厂不再需要知道所有产品的细节)

    父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实例化(创建)哪一个类。

    这些改进的思想,来源与简单工厂中拓展难的弊端,体现的是之前六大原则中描述的——封装变化!

  UML图:

    平行的等级结构,创建结构与产品结构平行,最简单的情况如下所示:

  

  当然可以像下图一样拓展任意个产品与创建者:

  

  可以看出,工厂方法是对简单工厂的进一步抽象!

  当然为了说明问题,再举一个现实生活中的例子:

  对于运动鞋来说有很多品牌(361°,特步等等),相应的也有不同的厂生成对应的鞋,这里361°等鞋就是具体的产品,而361°的厂则是工厂,专门负责生成对应的鞋。如果哪天想尝试新的品牌了(乔丹等),只需联系响应的工厂(创建工厂)即可。

  也就是说,顾客的鞋的等级结构与工厂的等级结构是一样的。提供产品不再只由一个工厂提供了。只需对顾客提供一个管理不同鞋厂的总厂(抽象工厂),而创建产品也延后到了它的各个工厂子类进行创建了!

  客户端调用前并不知道具体的返回类型,返回的是一个抽象类型的引用,它指向具体的实现类!

二、实践

  按照上面的例子,创建相应的代码:

  抽象工厂:

/**
* 抽象工厂类
* 作者: Administrator
* 日期: 2017/10/26
**/
public interface ShoeFactory {
Shoe factoryMethod();
}

  抽象产品:

/**
* 抽象产品类
* 作者: Administrator
* 日期: 2017/10/26
**/
public interface Shoe {
}

  具体工厂类:

/**
* 子工厂:耐克工厂类
* 作者: Administrator
* 日期: 2017/10/26
**/
public class NikeShoeFactory implements ShoeFactory{
@Override
public Shoe factoryMethod() {
return new NikeShoe();
}
}

  具体产品:

/**
* 具体产品类:耐克鞋
* 作者: Administrator
* 日期: 2017/10/26
**/
public class NikeShoe implements Shoe{
}

  客户端调用:

/**
* 客户端
* 作者: Administrator
* 日期: 2017/10/26
**/
public class Client {
public static void main(String[] args) {
ShoeFactory shoeFactory = new NikeShoeFactory();
Shoe shoe = shoeFactory.factoryMethod();
System.out.println(shoe);
}
}

  

三、改进与思考

  对于工厂方法模式,拓展是很容的。以上述例子为例,要新增鞋子,只需增加一个鞋子的类,再增加一个对应的工厂,而之前的完全不受影响。

而且是符合开闭原则的,不会需要到代码中去修改,而是对拓展开放。

  并且,根据阿里规范,对于使用了设计模式的地方,命名应当让人一眼看出使用了设计模式!

  当然,也可以有与简单工厂类似的循环利用对象而不是每次都创建新对象的变种。

Java设计模式(2)——创建型模式之工厂方法模式(Factory Method)的更多相关文章

  1. Java设计模式从精通到入门四 工厂方法模式

    工厂方法模式 属于23中设计模式中创建型类型. 核心思想:工厂提供创建对象的接口,由子类决定实例化哪一个子类. 来源 ​ 设计模式之禅中的例子,女娲造人,通过八卦炉来进行造人,没有烧熟的为白人,烧太熟 ...

  2. JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)

    简单工厂模式尽管简单,但存在一个非常严重的问题.当系统中须要引入新产品时,因为静态工厂方法通过所传入參数的不同来创建不同的产品,这必然要改动工厂类的源码,将违背"开闭原则".怎样实 ...

  3. 设计模式学习之工厂方法(Factory Method,创建型模式)(2)

    接着上一讲中的简单工厂继续讲解,假如我们有了需要采集新的水果梨子,如果我们使用简单工厂中的方式的话,就会新增一个Pear类,然后实现Fruit类,然后修改FruitFactory类中获取实例的方法 g ...

  4. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  5. Java设计模式学习记录-简单工厂模式、工厂方法模式

    前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...

  6. 设计模式---对象创建模式之工厂方法模式(Factory Method)

    前提:“对象创建”模式 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式(表现最为突出) 工 ...

  7. 设计模式的征途—3.工厂方法(Factory Method)模式

    上一篇的简单工厂模式虽然简单,但是存在一个很严重的问题:当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背开闭原则.如何实现新增新产品而 ...

  8. 小菜学习设计模式(三)—工厂方法(Factory Method)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

  9. Java 工厂模式(一)— 工厂方法(Factory Method)模式

    一.工厂方法(Factory Method)模式: 1.什么是工厂方法模式? 工厂方法模式是类的创建型模式,又叫做虚拟构造子模式或者多态工厂模式.它的意义是创建产品对象的工厂接口,将实际创建工作推迟到 ...

  10. iOS常用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

    1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂方法包含:父类拥有共同基础接口,具体子类实现子类特殊功能,工厂类根据参数区分创建不同子类实例.该场景对应的UML图如下 ...

随机推荐

  1. Linux 命令行浏览器

    真是没有做不到只有想不到! Linux下竟然有命令行式的浏览器:W3m SPC向下翻页 b向上翻页 J 向下滚动一行 K 向上滚动一行 > 右移一屏 < 左移一屏 TAB 转到下个超链接 ...

  2. Linux 系统查看tomcat控制台命令

    前提进入tomcat/logs文件夹下 查看全部命令是:tail -f catalina.out 如果想查看具体文件的日志进入该文件所在目录然后命令如下: tail -f filename

  3. 全链路实践Spring Cloud 微服务架构

    Spring Cloud 微服务架构全链路实践Spring Cloud 微服务架构全链路实践 阅读目录: 网关请求流程 Eureka 服务治理 Config 配置中心 Hystrix 监控 服务调用链 ...

  4. Quarzt定时调度任务

    简介 Quarzt是一个项目中定时执行任务的开源项目,Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独 ...

  5. 【JQ】鼠标经过一组button,弹出各自的气泡图片

    HTML <div id="bubble1" class="bubble"><img src="../image/p_bubble1 ...

  6. JSON解析问题

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/quanqinayng/article/details/25121955 这是data.chatFil ...

  7. BZOJ2822:[AHOI2012]树屋阶梯(卡特兰数,高精度)

    Description 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营.小龙分配的树屋建立在一颗高度为 ...

  8. 几句代码简单实现IoC容器

    前言 最近在调试EasyNetQ代码的时候发现里面有一段代码,就是IoC容器的简单实现,跟着他的代码敲了一遍,发现了奇妙之处.当然也是因为我才疏学浅导致孤陋寡闻了.他的思路就是通过动态调用构造函数生成 ...

  9. vue.js加入购物车小球动画

    生成一个动画小球的div,并且生成五个小球,五个是为了生成一定数量的小球来作为操作使用,按照小球动画的速度,一般来说五个也可以保证有足够的小球数量来运行动画 动画的内容分别是外层和内层,外层控制动画小 ...

  10. 如何将编写好的CS文件做成exe可执行文件

    编译好的控制台CS文件: cs文件单独拿出来放到F盘目录中 打开命令提示CMD: 执行下面语句即可在F盘目录中看到生成的exe文件,windows系统下双击就可运行: C:\Windows\Micro ...