【Java设计模式】007-简单工厂模式
目录
三、简单工厂模式
1、概述
2、应用场景
3、优缺点
优点
缺点
4、主要角色
5、代码实现
功能类
测试类
运行结果
四、工厂方法模式
1、概述
2、应用场景
3、优缺点
优点
缺点
4、主要角色
5、代码实现
功能类
测试类
运行结果
三、简单工厂模式
第二次梳理:对象的使用者不关心对象是如何创建的,对象的创建过程交给专门创建对象的工厂来完成,这就类似工厂生产产品一样,消费者不关心产品是如何被制造出来的,对于编程这适用于生成较为复杂的对象,将创建对象的过程进行封装以实现复用,减少使用的复杂度!时间:2021年05月13日 09时31分30秒
简单工厂模式:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类或实现了共同的接口!在简单工厂模式中用于创建对象的方法通常都是静态的,因此简单工厂模式又被称为静态工厂方法!时间:2021年05月13日 10时10分18秒
仅有一个工厂,该工厂负责多个产品的生产!时间:2021年05月13日 11时22分52秒
1、概述
简单讲:工厂模式就是工厂负责创建对象,使用者不关心对象的创建过程;简单工厂模式就是定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类或实现了共同的接口!
现实生活中,原始社会自给自足(没有工厂),农耕社会小作坊(简单工厂,民间酒坊),工业革命流水线(工厂方法,自产自销),现代产业链代工厂(抽象工厂,富士康)。我们的项目代码同样是由简到繁一步一步迭代而来的,但对于调用者来说,却越来越简单。
在日常开发中,凡是需要生成复杂对象的地方,都可以尝试考虑使用工厂模式来代替。
注意:上述复杂对象指的是类的构造函数参数过多等对类的构造有影响的情况,因为类的构造过于复杂,如果直接在其他业务类内使用,则两者的耦合过重,后续业务更改,就需要在任何引用该类的源代码内进行更改,光是查找所有依赖就很消耗时间了,更别说要一个一个修改了。
工厂模式:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中(补充:这里的测试并不是这么是实现的,实际使用中可对代码进行调整。测试代码实现的是简单工厂模式!时间:2021年05月13日 09时34分50秒)。这满足创建型模式中所要求的“创建与使用相分离”的特点。
按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。
我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”。
当要创建的产品不多,也就不需要每一个产品使用一个工厂了!可以向我的测试类写的那样,一个工厂负责创建多个产品!时间:2021年05月13日 09时53分26秒
在简单工厂模式中创建实例的方法通常为静态(static)方法,因此简单工厂模式(Simple Factory Pattern)又叫作静态工厂方法模式(Static Factory Method Pattern)。
简单来说,简单工厂模式有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式。简单工厂模式不在 GoF 23 种设计模式之列。
简单工厂模式每增加一个产品都要对工厂类进行修改,这增加了系统的复杂度,违背了“开闭原则”。
从这可以看出,教程本意确实与我写的测试类是不一致的(这里讲的内容应该是工厂方法模式),我的测试类对代码进行了简化,教程本意是创建一个抽象工厂接口,所有的具体工厂类实现这个接口,一个工厂对应一种产品的创建,使用哪个工厂创建产品就new哪个工厂指向抽象工厂接口,抽象工厂接口调取自己的方法即可实现对具体产品的创建。这种写法是相当麻烦有没有必要,因此还不如我在测试类中的写法,不需要抽象工厂接口,直接使用一个“复合”工厂来创建多个对象,需要什么对象,传进来相关参数,调用对应方法创建对象即可!时间:2021年05月13日 09时39分44秒
“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。
2、应用场景
对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。
3、优缺点
优点
工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确;
客户端无需知道所创建具体产品的类名,只需知道参数即可;
也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类;
缺点
简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则;
使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度;
系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂;
简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构;
4、主要角色
简单工厂(Simple Factory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象;
抽象产品(Product):是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口;
具体产品(Concrete Product):是简单工厂模式的创建目标;
5、代码实现
功能类
package com.zibo.design.one;// 抽象产品
public interface Dog{void sleep();
}// 工厂
class Factory {public static Dog createDog(String key){switch (key){case "大狗子":return new BigDog();case "小狗子":return new LittleDog();default:throw new RuntimeException("工厂不生产这个品种的狗!");}}
}// 具体产品1
class BigDog implements Dog {@Overridepublic void sleep() {System.out.println("大狗在睡觉!");}
}// 具体产品2
class LittleDog implements Dog {@Overridepublic void sleep() {System.out.println("小狗在睡觉!");}
}
测试类
package com.zibo.design.one;public class Test {public static void main(String[] args) {Factory.createDog("大狗子").sleep();Factory.createDog("小狗子").sleep();}
}
运行结果
大狗在睡觉!
小狗在睡觉!
四、工厂方法模式
这个工厂方法模式跟我之前学抽象工厂模式恰好相反!
1、概述
简单讲:抽象工厂提供创建产品的接口,每一个具体工厂创建一种具体的产品,使用者根据具体工厂,得到具体产品;
“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则;
满足开闭原则:当新增一个产品的时候只需要添加一个新的具体工厂,不需要修改原始代码;
2、应用场景
客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等;
创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口;
客户不关心创建产品的细节,只关心产品的品牌;
3、优缺点
优点
用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
灵活性增强,对于新产品的创建,只需多写一个相应的工厂类;
典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则;
缺点
类的个数容易过多,增加复杂度;
增加了系统的抽象性和理解难度;
抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决;
4、主要角色
抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品;
具体工厂(Concrete Factory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建;
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能;
具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应;
5、代码实现
功能类
package com.zibo.design.one;// 抽象产品
public interface Dog{void sleep();
}// 抽象工厂
interface DogFactory{Dog create();
}// 具体工厂1
class BigDogFactory implements DogFactory{public Dog create(){return new BigDog();}
}// 具体工厂2
class LittleDogFactory implements DogFactory{public Dog create(){return new LittleDog();}
}// 具体产品1
class BigDog implements Dog {@Overridepublic void sleep() {System.out.println("大狗在睡觉!");}
}// 具体产品2
class LittleDog implements Dog {@Overridepublic void sleep() {System.out.println("小狗在睡觉!");}
}
测试类
package com.zibo.design.one;public class Test {public static void main(String[] args) {BigDogFactory bigDogFactory = new BigDogFactory();bigDogFactory.create().sleep();LittleDogFactory littleDogFactory = new LittleDogFactory();littleDogFactory.create().sleep();}
}
运行结果
大狗在睡觉!
小狗在睡觉!
【Java设计模式】007-简单工厂模式相关推荐
- Java设计模式之简单工厂模式实验(软件工程综合实践课程第二周)
实验目的 1 .理解软件设计的相关理论 : 2 .理解面向对象设计原则: 实验内容 1 .简单工厂模式实验: (1) 参考讲义上的代码,利用简单工厂模式完成计算器应用程序: (2) 画出计算器程序简单 ...
- Java设计模式之 简单工厂模式和工厂方法实验报告书
目录 Java设计模式之 1 简单工厂模式和工厂方法实验报告书 1 实验四:简单工厂模式和工厂方法 2 一.实验目的 2 二.实验内容 2 三.实验步骤 2 3.1简单工厂模式:女娲 2 3.2简单工 ...
- Java设计模式之简单工厂模式(Simple Factory)
[Java与模式]简单工厂模式(Simple Factory---吴义) 首先说明,Java与模式一系列的文章均是参考阎宏博士的<Java与模式>一书,加上自身的一些体会的探索,产生如下文 ...
- java设计模式之简单工厂模式
定义: 由一个工厂对象决定创建出哪一种产品类的实例 类型:属于创建型,但不属于GOF23中设计模式 工厂模式分为三种: 1.简单工厂模式(静态工厂方法模式) 2.工厂方法模式(多态性工厂模式) 3.抽 ...
- java设计模式:简单工厂模式
一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 二.简单工厂模式的角色和职责 1.工厂(C ...
- JAVA设计模式笔记(简单工厂模式)
有一个水果加工工厂,我们的需求是实现加工水果的功能.常见的做法是创建一个水果抽象类,写一个抽象的加工方法,然后创建具体的水果类去继承抽象类,再去实现抽象方法,最后客户端再去新建对象实例. public ...
- 工厂模式 java场景_研磨设计模式之简单工厂模式(场景问题)
简单工厂不是一个标准的设计模式,但是它实在是太常用了,简单而又神奇,所以还是需要好好掌握的,就当是对学习设计模式的热身运动吧.为了保持一致性,我们尽量按照学习其它模式的步骤来进行学习. 1 场景问题 ...
- 设计模式之简单工厂模式(Java 实现)
设计模式之简单工厂模式(Java 实现) 本文首发于http://www.imooc.com/wiki/Designlesson/factory.html 简单工厂模式是平时开发过程中最常见的设计模式 ...
- .NET设计模式(1): 简单工厂模式
.NET设计模式(1): 简单工厂模式 最近一直在看设计模式,想把自己的学习笔记与大家分享一下,如果能帮助大家的话,我会非常高兴,同时也欢迎大家指出里面的不足.园子里其实关于此类文章已经很多了,如果d ...
- 大牧絮叨设计模式:简单工厂模式
文章目录 1. 简单工厂模式概述 1.1.简单工厂模式核心组件 1.2.简单工厂模式优缺点 2.` Java`实现 公共父类定义 产品具体实现类 简单工厂定义 代码运行测试: 3. `Python`实 ...
最新文章
- pix4d怎么查看点云数据_python里怎么查看数据类型
- 浅谈JavaScript作用域,关于Java的学习路线资料
- 网络编程(part8)--传输层服务之TCP和UDP
- 应用前台省电秘籍——这些常见功耗雷坑不要再跳了
- 23 WM配置-策略-入库策略3-定义现有库存的附加策略I(Addition to Existing Stock Strategy)
- 图书管理系统/库存管理系统等计算机毕业论文设计
- 计算机四级网络工程师总结
- 阿里、腾讯、华为人力资源体系
- AdventureWorks数据库数据字典研究
- java述职报告ppt_java开发人员述职报告.ppt
- AI崛起,阿里的科技孵化力|甲子光年
- 如何安装linux安装光盘中的软件包
- 小程序前景无限,还能一键转换成App?
- 前端模块化、组件化开发
- CAShapeLayer和UIBezierPath
- 2013-04-26-成都华为实习生招聘上机笔试
- 分区数据丢失怎么恢复?恢复磁盘分区数据的方法
- 在idea中创建maven工程,搭建spring MVC框架,完成和servlet相似的操作
- Win10常用的快捷键和触摸板操作合集
- 港科夜闻|香港科技大学(广州)倪明选校长一行到访广东省科学技术厅,与龚国平厅长、吴世文副厅长参加交流座谈会议...