模式的秘密--工厂模式

工厂模式概念:

  1. 实例化对象,用工厂方法代替new操作
  2. 工厂模式包括工厂方法模式和抽象工厂模式
  3. 抽象工厂模式是工厂方法模式的扩展

工厂模式的意图:

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

什么情况下适合工厂模式

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

工厂模式的动机

项目中的现状:

软件系统中经常面临对象的创建工作,由于需求的变化,这个对象可能也随之发生变化,但他却拥有比较稳定的接口。

为此,我们需要提供一种封装机制来隔离出这个易变对象的变化,从而保持系统中其他依赖该对象的对象不随之需求变化而变化。

 

基于项目现状将代码进行如下设计:

1,尽量松耦合,一个对象的依赖对象的变化与本身无关。

2,具体产品与客户端剥离,责任分割。

 

项目:

 

说明:

 

实现代码:

先定义一个接口:发型接口:

package com.Factory;
/** 发型接口* */
public interface HairInterface {//实现了发型public void draw();
}

定义两个实现类:

package com.Factory;public class LeftHair implements HairInterface {/** 画了一个左偏分发型* */@Overridepublic void draw() {// TODO Auto-generated method stubSystem.out.println("----------实现了左偏发型------------");}
}

package com.Factory;public class RightHair implements HairInterface {/** 画了一个右偏分发型* */@Overridepublic void draw() {// TODO Auto-generated method stubSystem.out.println("----------实现了右偏分发型------------");}
}

测试:不使用工厂的实现方式:

package com.Factory;
/** 模拟客户端实现* */
public class SunnyTest {public static void main(String[] args) {//不用工厂的方式实现HairInterface left=new LeftHair();left.draw();}
}

这种方式很麻烦。

 

可以通过工厂模式解决:

工厂类:分别用普通的工厂类和通过反射实现的工厂类实现。

package com.Factory;
/** 发型工厂* */
public class HairFactory {//普通的工厂方式public HairInterface getHair(String key){if("left".equals(key)){return new LeftHair();}else if("Right".equals(key)){return new RightHair();}return null;}/** 通过反射实现工厂* 根据类的名称来生产对象* */public HairInterface getHairByClass(String className){try {HairInterface hair=(HairInterface)Class.forName(className).newInstance();return hair;} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return null;}
}

 

分别用三种方式实现:

package com.Factory;
/** 模拟客户端实现* */
public class SunnyTest {public static void main(String[] args) {//不用工厂的方式实现HairInterface left=new LeftHair();left.draw();//使用普通工厂的方式HairFactory factory=new HairFactory();HairInterface left2=factory.getHair("left");left2.draw();//使用反射实现的工厂HairInterface right=factory.getHairByClass("com.Factory.RightHair");right.draw();}}

 

 

 

 

 

 

 

 

 

---恢复内容结束---

转载于:https://www.cnblogs.com/alsf/p/8486262.html

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

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

相关文章

mysql定时清空表数据_Mysql实现定时清空一张表的旧数据并保留几条数据

要达到如下目的:Mysql数据库会每隔一段时间(可以是2小时,也可以是一天,这个可以自定义),定时对一张库中的表做一个判断,如果这张表的数据超过了20条(这个数据也是自定义的,也可以是200条),就保留…

Python中生成器generator和迭代器Iterator的使用方法

一、生成器 1. 生成器的定义 把所需要值得计算方法储存起来,不会先直接生成数值,而是等到什么时候使用什么时候生成,每次生成一个,减少计算机占用内存空间2. 生成器的创建方式 第一种只要把一个列表生成式的 [ ] 改成 ( )ret (n 1 for n in range(0,10)) # 返回值是生成了一个…

Java 8中使用Lambda表达式的策略模式

策略模式是“ 设计模式:可重用对象的元素”书中的模式之一 。 本书所述的策略模式的意图是: 定义一系列算法,封装每个算法,并使它们可互换。 策略使算法独立于使用该算法的客户端而变化。 在本文中,我想给出一个或两个…

Html5移动开发之Localstorage(本地存储)

HTML5本地存储Localstorage自从Html5中出现了本地存储的(LocalStorage)的概念后,很多人都会想这个东西和我们传统web开发中的Cookie有什么特别之处,当然笔者也是其中之一,也难怪,以前用惯了cookie对于新出现的事物总是…

php mysql 正则_MySQL 正则表达式

MySQL 正则表达式在前面的章节我们已经了解到MySQL可以通过 LIKE ...% 来进行模糊匹配。MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表达式匹配。如果您了解PHP或Perl,那么操作起来就非常简单,因为MySQL的正…

Linux自动人机交互expect

exp_test.sh文件 #!/bin/bash/expect ## exp_test.sh set timeout -1; spawn ssh localhost; expect {"(yes/no)" {send "yes\r";exp_continue;}"password:" {send "hadoop\r";exp_continue;}eof {exit 0;} } 执行:expect …

使用Spring Integration聚合异步结果

嗨,我遇到了一个问题,该问题使用Spring Integration具有非常好的解决方案。 很多时候,我们需要一种将消息分发到未知数量的目的地的方案。 为此,我们使用主题方法。 但是有时,我们还希望从收到消息的所有目的地接收答案…

Html5开发之链接标签nav的用法

HTML(<nav>)元素用来表示一个含有多个超链接的区域&#xff0c;这个区域的连接可以连接到其他页面&#xff0c;也可以连接到本页面内部其他部分。用法说明:并不是所有的链接都必须使用<nav>元素,它只用来将一些热门的链接放入导航栏,例如<footer>元素就常用来…

java response 获得code_Java教程分享使用HttpClient抓取页面内容

Java教程分享使用HttpClient抓取页面内容&#xff0c;使用HttpClient工具来发送Http请求1.简介HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新的版本和…

关于Function原型对象和Object原型对象的一些疑惑

网上有一道美团外卖的面试题是这样的&#xff1a;Function.prototype.a a; Object.prototype.b b; function Person(){}; var p new Person(); console.log(p.a: p.a); // p.a: undefined console.log(p.b: p.b); // p.b: b问为什么&#xff1f;有不少同学第一眼看上去就觉…

HTML5 实现离线数据缓存

1.配置缓存文件 cache manifestMIME TYPE&#xff1a;text/cache-manifest文件名称&#xff1a;name.appcache作用&#xff1a;用于配置需要缓存的文件2.使用方法在服务器上添加MIME TYPE在apache virtual host 中添加[plain] view plaincopyAddType text/cache-manifest .appc…

pytest.7.常见套路

From: http://www.testclass.net/pytest/common_useage/ 在使用pytest的时候&#xff0c;下面这些问题我们可能会经常遇到&#xff0c;这里给出官方的解决方案&#xff0c;按照套路来执行就可以了。 基础用法 把命令行参数传入到用例动态添加命令行参数根据命令行参数来忽略用例…

linux mysql 5.6.23_MySQL 5.6.23升级到MySQL 5.7.9

MySQL 5.6.23升级到MySQL 5.7.9MySQL 5.7.9新特性一、安全性1.1. 用户表 mysql.user 的 plugin字段不允许为空&#xff0c; 默认值是 mysql_native_password&#xff0c;而不是 mysql_old_password&#xff0c;不再支持旧密码格式;1.2. 增加密码过期机制&#xff0c;过期后需要…

Spring Data JPA教程第一部分:配置

Spring Data JPA是一个旨在简化基于JPA的存储库的创建并减少与数据库通信所需的代码量的项目。 在我的工作和个人爱好项目中&#xff0c;我已经使用了一段时间&#xff0c;确实使事情变得更加简单和整洁。 现在是时候与您分享我的知识了。 这是我的Spring Data JPA教程的第一部…

2018-03-02

1、首先我得重新在git设置一下身份的名字和邮箱&#xff08;因为当初都忘了设置啥了&#xff0c;因为遇到坑了&#xff09;进入到需要提交的文件夹底下&#xff08;因为直接打开git Bash&#xff0c;在没有路径的情况下&#xff0c;根本没&#xff01;法&#xff01;改&#xf…

《算法通关村——再次透彻理解动态规划》

《算法通关村——透彻理解动态规划》 91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; A -> "1" B -> "2" ... Z -> "26"要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反…

html5新特性:异步上传文件

<!DOCTYPE html><html><head><meta charset"utf-8"/><title>html5文件上传</title></head><body><input type"file" name"file" id"file" /><br/><input type"s…

查看环境变量有无配置成功等命令操作

查看环境变量有无配置成功 &#xff1a;windowR cmd set&#xff08;回车&#xff09; 现在可以看到配置成功的环境变量NVM_HOME NVM_SYMLINK等环境变量 也可以单独查看某个变量有无配置成功,例如set NVM—HOME. 转载于:https://www.cnblogs.com/JavascriptAndHtml5/p/9469932…

WildFly 8.0.0.Alpha1的发布和一些历史

自从我们发布WildFly 8.0.0.Alpha1版本以来&#xff0c; 已经过去了大约2周。 该下载位于WildFly下载页面上 。 我敢肯定&#xff0c;你们中的许多人可能会想知道WildFly是什么&#xff0c;而其中一些知道它是什么的人可能不会知道已经发布了。 我将尝试回答其中一些问题&#…

mysql中字典值怎么添加_插入Python字典中的值,包括MySQL的键

我有以下字典&#xff1a;{ : [0, 9],3904: [playback_error, 87],3808: [playback_error, 24],3902: [qp_library_failed_to_start, 1],3903: [playback_error, 464],3805: [playback_error, 141],3807: [playback_error, 29],3806: [playback_error, 1],1309: [playback_erro…