轻松看懂java设计模式简单工厂模式
点击上方“好好学java”,选择“置顶公众号”
优秀学习资源、干货第一时间送达!
精彩内容
java实战练习项目教程
2018微服务资源springboot、springcloud、docker、dubbo实战等倾心分享
2018年java架构师全套学习教程
最新大数据培训完整视频教程
2018年java最新全套培训学习教程
一、什么是简单工厂模式
简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
二、简单工厂模式的角色和职责
1.工厂(Creator)角色简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
2.抽象(Product)角色简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3.具体产品(Concrete Product)角色简单工厂模式所创建的具体实例对象
三、简单工厂模式的UML图
sports:抽象角色
Basketball和Football:具体产品角色
sportsFactory:工厂角色
四、简单工厂模式代码
这个例子,用运动作为抽象角色,足球和篮球作为具体的产品角色来讲解,下面看具体代码。
首先我们创建一个抽象类sports,同时有一个运动的方法
public interface Sports {/** 运动*/public void play();
}
然后,定义了一个足球类和篮球类,同样有运动方法
public class Basketball implements Sports{/** 运动*/public void play(){System.out.println("打篮球...");}
}
public class Football implements Sports{/** 运动*/public void play(){System.out.println("踢足球啦...");}
}
最后写一个工厂类,用来创造足球运动和篮球运动。
这里创建的方式有很多种方式,我们从简单的开始,逐步优化代码。
4.1、单独创建实例方法
public class SportsFactory {/** 获得Basketball类的实例public static Sports getBasketball() {return new Basketball();}/** 获得Football类实例*/public static Sports getFootball() {return new Football();}
}
这种方法,直接用两个不同的方法直接创建两个实例对象。
4.2、逻辑判断的方式
public class SportsFactory {/** getSports方法,获得所有产品对象*/public static Sports getSports(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {if(type.equalsIgnoreCase("Basketball")) {return Basketball.class.newInstance();} else if(type.equalsIgnoreCase("Football")) {return Football.class.newInstance();} else {System.out.println("找不到相应的实例化类");return null;}}
}
先传入一个类型参数,然后判断,再用反射的方式返回对象。
前面这两种方式都不是最优的方式,因为他们都违背了开闭原则。
开闭原则定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
开放-封闭原则的意思就是说,你设计的时候,时刻要考虑,尽量让这个类是足够好,写好了就不要去修改了,如果新需求来,我们增加一些类就完事了,原来的代码能不动则不动。这个原则有两个特性,一个是说“对于扩展是开放的”,另一个是说“对于更改是封闭的”。面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。这就是“开放-封闭原则”的精神所在。
下面,我们再优化一下。
4.3、反射实现方式
public class SportsFactory {/** getSports方法,获得所有产品对象*/public static Sports getSports(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {Class Sports = Class.forName(type);return (Sports) Sports.newInstance();}
}
这种方法,通过反射的方式实现,不管我们还需要扩展什么其他功能都不用再更改这个工厂类的代码了,所以就符合开闭原则了。
五、测试
public class MainClass {public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {//方法一测试
// //实例化一个Basketball
// Basketball Basketball = new Basketball();
// //实例化一个Football
// Football Football = new Football();
//
// Basketball.play();
// Football.play();//方法二测试
// //实例化一个Basketball,用到了多态
// Sports Basketball = new Basketball();
// Sports Football = new Football();
// Basketball.play();
// Football.play();// //实例化一个Basketball
// Sports Basketball = SportsFactory.playBasketball();
// Sports Football = SportsFactory.playFootball();
// Basketball.play();
// Football.play();//方法三测试Sports Basketball = SportsFactory.getSports("Basketball");Sports Football = SportsFactory.getSports("Football");Basketball.play();Football.play();}
}
运行结果:
六、简单工厂模式应用场景
优点:工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点:由于工厂类集中了所有实例的创建逻辑,违反了开闭原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
觉得有用就转发分享一下吧
推荐阅读
1. 一文读懂HttpServletRequest
2. 一文读懂HttpServletResponse
3. servlet就是这么简单
4. tomcat基本使用,就是这么简单
附上热门QQ群,存放资源和历史资料,2000容量(低门槛付费群),长按二维码入群
轻松看懂java设计模式简单工厂模式相关推荐
- java设计模式--简单工厂模式
1.概念:建立一个工厂(一个函数或一个类方法)来制造新的对象,简单工厂模式静态工厂方法模式,存在的目的很简单:定义一个用于创建对象的接口. (注意点:简单工厂模式的方法是静态的) 2.组成: 1) 工 ...
- Java设计模式 -- 简单工厂模式(SimpleFactory)
一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 二.模式中包含的角色及其职责 1.工厂(C ...
- Java——设计模式(简单工厂模式)
* A:简单工厂模式概述* 简单工厂模式又叫静态工厂方法模式,它定义了一个具体的工厂类负责创建一些类的实例* B:优点* 客户端不需要再负责对象的创建,从而明确了各个类的职责* 简单来说,客户端你只需 ...
- java设计模式-简单工厂模式
1.实例化对象不需要new,用工厂模式 2.工厂模式分为(简单工厂模式,工厂方法模式,抽象工厂模式) package com.wuming.factory.simple;public interfac ...
- Java设计模式之 工厂模式(简单工厂模式)
前一阵子学习了Java 中据说是最简单的设计模式的 单例模式,想一起讨论学习的小伙伴请点击这里: Java 设计模式之单例模式 那么今天就把学习的工厂模式记录下来 工厂模式: 实现了创建者和调用者的分 ...
- java设计模式之工厂模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- Java设计模式之工厂模式篇 (转)
Java设计模式之工厂模式篇 (转)[@more@]Java设计模式之工厂模式篇 作者:冯睿 本文选自:赛迪网 2003年03月07日 .NET.com.cn/servlets/ad?Pool=te ...
- Java设计模式(工厂模式>抽象工厂模式和原型模式)
Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...
- 三角形圆形创建与擦除java_设计模式---------------简单工厂模式
设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...
最新文章
- android将矩阵转换成字节数组,android-使用OpenGL矩阵转换将纹理从“ 1D”映...
- HDU Redraw Beautiful Drawings 推断最大流是否唯一解
- mysql 索引 lt =_MySQL索引相关
- linux目录隐藏技术,Linux环境下的高级隐藏技术
- RabbitMQ(3) Spring boot集成RabbitMQ
- 考勤系统之计算工作小时数
- Java书籍推荐(这些书你看过几本?)
- 卓有成效的管理者(笔记)——如何发挥人的长处
- openwrt下如何生成ipk包到对应的开发板上运行 以helloword为例(三)
- android 3d翻转动画 viewpage,利用ViewPager实现3D画廊效果及其图片加载优化
- 【Windows】六种正确清理C盘的方法,解决你的红色烦恼
- signature=cc8d613f503e9b933c233da06afc0fc6,襄阳市公安局交通警察支队违法车辆信息公告20210118...
- 微信h5界面隐藏刷新功能_隐藏微信H5页面下拉出现的网址
- 爬取微博视频页并批量下载python+requests+ffmpeg(连接视频和音频)
- ehvierwer登录与不登录_微信上不去了怎么办,峰哥教你微信登录不上去的办法
- 用html5画瀑布图,一起制作瀑布图
- vue图形验证码组件
- 许昌一高2021年高考成绩查询,2020年许昌高中高考成绩怎么样啊??
- 史上最全的测试用例设计方法
- Windows下安装openvino问题汇总
热门文章
- 正在研究d2010的dcu格式
- Item 29. Virtual Constructors and PrototypeItem 30. Factory Method
- SpringBoot整合Mybatis超详细流程
- java.lang.ClassNotFoundException: org/apache/xerces/parsers/SAXParser
- sql注入——day02
- 形式化方法、《大象:Thinking in UML》
- 数据结构--队列(链表实现)
- 【自动群发小助手】微信也能定时发送消息?过年终于不用熬夜守点发祝福了~
- 判断子序列不同的子序列两个字符串的删除操作编辑距离
- [TT]-Trustonic acronyms