设计模式之——工厂模式

一、相关概念了解

首先知晓什么是工厂模式(概念)?

  ①实例化对象,用工厂方法代替new操作。②工厂模式包括工厂方法模式和抽象工厂模式。③抽象工厂模式是工厂方法模式的拓展。

 

其次明白工厂模式的意图

  ①定义一个借口来创建对象,但是让子类来决定哪些类需要被实例化。②工厂方法把实例化的工作推迟到子类中去实现。

最后了解什么情况下适合工厂模式?

  ①有一组类似的对象需要创建。②在编码时不能预见需要创建哪种类的实例。③系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节。

二、几种工厂模式的描述(打比方)

三、主要实现方式

以发型实现为例:

(一)常规方法

1.创建接口,定义实现发型的方法

package Factory.sunny.project;
/*** 发型接口* * */
public interface HairInterface {//实现了发型public void draw();    //注意 :  接口中没有方法体
        
}

2.用相应的类来实现该接口,重写接口内的方法

左偏分发型——

package Factory.sunny.project;public class LeftHair implements HairInterface {@Overridepublic void draw() {// TODO Auto-generated method stubSystem.out.println("---------左偏分发型------------");}
}

右偏分发型——

package Factory.sunny.project;public class RightHair implements HairInterface {@Overridepublic void draw() {// TODO Auto-generated method stub
        System.out.println("------------右偏分发型----------");}}

3.测试代码(贴一小段主要的)

    HairInterface left=new LeftHair();left.draw();

缺点是每来一个发型都需要创建新的...Hair类实现,而且还要在客户端调用,不利于维护......

(二)采用发型工厂方法

1.创建发型工厂

package Factory.sunny.project;import java.util.Map;/*** 发型工厂* */
public class HairFactory {/*** 根据类型创建对象* */    
public HairInterface getHair(String key){if("left".equals(key)){//字符放在前面是预防key报空指针return new LeftHair();}else if("right".equals(key)){return new RightHair();}return null;
}
}

2.测试

    HairFactory factory=new HairFactory();HairInterface left=factory.getHair("left");left.draw();

缺点:不智能,判断条件太冗杂,解决办法——>反射

(三)反射方法解决上述问题(一步到位,采取映射)

1.首先看未采取映射办法的代码

//生产发型的方法,为了优化上面代码对于大量发型的大量判断,使用反射原理,类似于spring里的BeanFactorypublic HairInterface getHairByClass(String className){try { HairInterface hair=(HairInterface) Class.forName(className).newInstance();return hair;} catch (InstantiationException e) {// TODO Auto-generated catch block
        e.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch block
        e.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch block
        e.printStackTrace();}return null;
}

2.采取映射的代码(在此之前先要创建properties文件和properties文件读取类

properties文件

properties文件读取类

 

package Factory.sunny.project;import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;/*** properties文件的读取工具* * */
public class ProrpertiesReader {public Map<String,String> getProperties(){Properties props =new Properties();Map<String,String> map=new HashMap<String,String>();//将key和property读入到map中try {InputStream in=getClass().getResourceAsStream("type.properties");props.load(in);Enumeration en=props.propertyNames();  while(en.hasMoreElements()){String key=(String) en.nextElement();String property=props.getProperty(key);map.put(key, property);}} catch (IOException e) {// TODO Auto-generated catch block
            e.printStackTrace();}return map;}}

反射&映射方法代码

public HairInterface getHairByClasskey(String key){try {   Map<String,String> map=new ProrpertiesReader().getProperties();HairInterface hair=(HairInterface) Class.forName(map.get(key)).newInstance();return hair;} catch (InstantiationException e) {// TODO Auto-generated catch block
        e.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch block
        e.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch block
        e.printStackTrace();}return null;
}

 3.测试

    //反射方法
HairInterface right=factory.getHairByClass("Factory.sunny.project.RightHair");
right.draw();// 反射&映射方法HairInterface hair
=factory.getHairByClasskey("right");hair.draw();HairInterface hair2=factory.getHairByClasskey("in");hair2.draw();

 

转载于:https://www.cnblogs.com/zjfjava/p/6496974.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

吴恩达团队盘点2019AI大势:自动驾驶寒冬、NLP大跃进、Deepfake已成魔!

来源&#xff1a;新智元&#xff08;AI_era&#xff09;还有几天&#xff0c;我们就要和2019年说再见了。今年是AI从梦想变为现实的一年&#xff0c;从NLP到自动驾驶&#xff0c;从人脸识别到数据模拟&#xff0c;有哪些技术突破面世&#xff0c;又遭遇了哪些新的困难&#xff…

4怎么修边_亦木良品阻燃板怎么样

亦木良品阻燃板怎么样防火板_橱柜资料选择很重要美观耐用才是重点。橱柜资料1、防火板是由多层牛皮纸经酚醛树胶浸渍后与一层经浸渍的装饰纸在高温高压下压制而成&#xff0c;将防火板经冷压或热压在中密度板或刨花板上用作橱柜门板。普通防火板的耐磨、耐划、耐高温等性能要好…

QT:KeepAliveOption的应用

由于用QTcpSocket写网络通讯程序&#xff0c;当正常服务端或者客户端断开的时候&#xff0c;我们监测信号即可&#xff1a;Signals&#xff1a;stateChanged(QAbstractSocket::SocketState)。&#xff08;手动关闭网络连接&#xff0c;也会检测到断开&#xff09; 但是当若是有…

Science:2019年度最佳科学照片

来源&#xff1a;ScienceAAAS、DeepTech深科技摘要 《Science》杂志在 近日选出了在这一年中最受欢迎&#xff0c;也最具有视觉冲击力的照片。1、Weather above 天气之上摄影师、飞行员Santiago Borja在太平洋上空拍摄到的巨大雷暴。科学家希望知道这种风暴是否会将化学物质注…

多源异构数据_构建数字孪生城市的CIM数据平台哪家强?

文/王颖初 数字城市系统建设中数据领域存在的问题随着经济的发展和信息化水平的飞速提升&#xff0c;数字城市的系统建设也日益普及。数字城市涉及规划、建设、城市管理、国土、交通、水利、安防、人防、环境保护、文物保护、能源燃气等各大行业&#xff0c;及一切与智慧城市相…

behavior php,YII2框架中behavior行为的理解与使用方法示例

本文实例讲述了YII2框架中behavior行为的理解与使用方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;YII2中的行为说白了就是对组件功能的扩展&#xff0c;在不改变继承关系的条件下。行为附加到组件后&#xff0c;行为将注入自已的方法和属性到组件&#xff0c;可…

乐观锁和悲观锁_什么是悲观锁和乐观锁?

思维导图文章已收录Github精选&#xff0c;欢迎Star&#xff1a;https://github.com/yehongzhi/learningSummary悲观锁悲观锁是平时开发中经常用到的一种锁&#xff0c;比如ReentrantLock和synchronized等就是这种思想的体现&#xff0c;它总是假设别的线程在拿线程的时候都会修…

为了研究因果关系,原来科学家在这么多方向上都有尝试

来源&#xff1a;混沌巡洋舰1. 为何关注因果关系在现代科学之前&#xff0c;不管东西方&#xff0c;都是从经验出发&#xff0c;通过归纳获得知识&#xff0c;然而这样的知识&#xff0c;受限于观测&#xff0c;无法产生突破性的成果&#xff0c;在这样的模式下&#xff0c;再探…

mysql 有一组经纬度 返回在某个区域内_Qt编写地图综合应用17-地址经纬度互转

## 一、前言地址和经纬度互相转换的功能也经常用到&#xff0c;比如上次的路线方案查询的功能&#xff0c;之前官网是提供了直接输入出发地点和目的地的中文汉字&#xff0c;就可以查询到最优的路线&#xff0c;后面只支持输入出发地点和目的地的经纬度坐标了&#xff0c;这个就…

杨强 : 迁移学习——人工智能的最后一公里

来源&#xff1a;智能系统学报11月30日上午&#xff0c;第九届吴文俊人工智能科学技术奖颁奖典礼暨2019中国人工智能产业年会在苏州广电大厦演播厅隆重举行。本届大会主题是“突破关键技术赋能产业落地”。大会邀请到国家部委专家、两院院士和产业领军人士&#xff0c;围绕77场…

直接点oracle表编辑器,DbForge Studio for Oracle入门教程:如何在表编辑器中创建表...

dbForge Studio for Oracle是一个功能强大的集成开发环境(IDE)&#xff0c;它提供了通用的数据编辑工具来管理数据库内和外部数据&#xff0c;能够帮助Oracle开发者提高PL/SQL的编码速度。【dbForge Studio for Oracle 最新试用版下载】在本文示例中&#xff0c;我们将创建一个…

设置窗口置顶_这三个应用,每一个都能让你置顶。

| 当你有多个窗口同时打开&#xff0c;置顶其中某个或某些&#xff0c;能够方便你对比、学习、抄写……但不是所有软件都有这个功能&#xff0c;所以你需要今天的小干货。|-----------你的高效生活视频书。将窗口置顶&#xff0c;可以方便我们对比、写作、修改文案或代码&#…

汽车传感器科普

来源&#xff1a;湖杉资本先进驾驶辅助系统&#xff08;Advanced Driver Assistant System&#xff09;&#xff0c;简称ADAS&#xff0c;是利用安装于车上的各式各样的传感器&#xff0c; 在第一时间收集车内外的环境数据&#xff0c; 进行静、动态物体的辨识、侦测与追踪等技…

人工智能的现状与未来

来源&#xff1a; CIO之家几十年来计算速度飞速提高&#xff0c;从最初的科学数学计算演变到了现代的各种计算机应用领域&#xff0c;诸如多媒体应用&#xff0c;计算机辅助设计&#xff0c;数据库&#xff0c;数据通信&#xff0c;自动控制等等&#xff0c;人工智能是计算机科…

php分页技术的作用,分页原理技术细节剖析(php+mysql)实例

提到分页&#xff0c;大家都不陌生&#xff0c;在我们日常浏览网页时常遇到&#xff0c;尤其新闻文章列表等都有分页&#xff0c;如下图所示&#xff1a;分页实例下面&#xff0c;通过一个实例为大家剖析一下分页原理上技术细节。一、功能开发思路在分页功能的实现前&#xff0…

2020年物联网发展现状与趋势预测

来源&#xff1a;北京物联网智能技术应用协会一、综述物联网源于互联网领域&#xff0c;是信息科学技术产业的第三次革命。物联网是基于互联网&#xff0c;让所有物体能够独立寻址的普通物理对象实现互联互通的网络。简单说&#xff0c;就是通过安装信息传感设备&#xff0c;如…

shell中执行某条语句失败能不能重复执行_如何理解Mysql中的事务隔离级别?

要说清楚Mysql中的事务隔离级别&#xff0c;我们先从事务的定义说起。事务&#xff0c;是一个或一组sql语句组成的一个执行单元&#xff0c;这个执行单元要么全部执行&#xff0c;要么全部不执行。整个单独单元作为一个不可分割的整体&#xff0c;如果单元中某条sql语句一旦执行…

oracle 试图访问已经在使用的事物处理临时表,解决ORA-14450:试图访问已经在使用的事务处理临时表...

在开发使用过程中&#xff0c;一个存储过程用到表TMP_DA_GMS,允许程序的时候报错&#xff0c;后台查询到错误原因是因为表里有个字段需要设置为可以为N在开发使用过程中&#xff0c;一个存储过程用到表TMP_DA_GMS,允许程序的时候报错&#xff0c;后台查询到错误原因是因为表里有…

《数字孪生体技术白皮书(2019)》(简版)全文

来源&#xff1a;《数字孪生体实验室原创》12月27日&#xff0c;数字孪生体实验室与安世亚太联合正式发布了《数字孪生体技术白皮书&#xff08;2019&#xff09;》。白皮书的第一部分关注对数字孪生体的抽象和总结。无论是参考架构、成熟度模型还是关键技术&#xff0c;都以“…

sql 删除字段中下划线_SQL基础教程知识点总结

1. ●列 ●字段 ●行 ●记录 2. SQL 语句及其种类 DDL DDL(Data Definition Language&#xff0c;数据定义语言)用来创建或者删除存储 数据用的数据库以及数据库中的表等对象。DDL 包含以下几种指令。 CREATE:创建数据库和表等对象 DROP: 删除数据库和表等对象 ALTER: 修改数据…