一天一种设计模式之六-----工厂方法模式

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一.工厂方法模式

  1. 工厂方法模式属于创建型模式。

  2. 工厂方法模式定义:定义一个用于创建对象的借口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到了他的子类。

  3. 一般工厂类会有一个工厂的接口,实现类也有一个实现的接口。工厂接口负责定义一个创建实现接口的方法,而工厂类负责创建具体的实现类。

  4. 工厂模式根据抽象程度的不同分为三种:简单工厂模式(也叫静态工厂模式),工厂方法模式以及抽象工厂模式。工厂模式是编程中经常会遇到的一种模式。

  5. 工厂方法模式的优点有:

    1. 使代码结构清晰,有效的封装变化。在编程中,产品类的实例化有时候是复杂多变的,通过工厂模式将产品的实例化封装起来,是的调用者无需关心实例化过程只需依赖工厂即可得到自己想要的产品。

    2. 对调用者屏蔽具体的产品类。如果使用工厂模式,调用者只需要关心产品的接口就可以了,即使变更了具体的实现,对调用这来说没有任何影响。

  6. 工厂方法模式符合开放封闭原则,迪米特法则,依赖倒置原则。

    二.测试代码

  7. 测试代码如下(实现一个计算器)下属模式中,如果新增了其他的计算类,只需要新建一个计算类实现,和相应的计算类工厂就可以了。

  8. public class GongChangMethodTest {public static void main(String[] args) {IFactory factory = new SumFactory();Jisuan jisuan = factory.createJisuan();jisuan.setNum1(12);jisuan.setNum2(44);;System.out.println(jisuan.getResult());}
    }interface IFactory {Jisuan createJisuan();
    }class SumFactory implements IFactory {@Overridepublic Jisuan createJisuan() {return new SumJisuan();}}class SubFactory implements IFactory {@Overridepublic Jisuan createJisuan() {return new SubJisuan();}
    }class MulFactory implements IFactory {@Overridepublic Jisuan createJisuan() {return new MulJisuan();}
    }class DevFactory implements IFactory {@Overridepublic Jisuan createJisuan() {return new DevJisuan();}
    }abstract class Jisuan {private int num1;private int num2;public Jisuan() {}public Jisuan(int num1, int num2) {this.num1 = num1;this.num2 = num2;}public abstract int getResult();public int getNum1() {return num1;}public void setNum1(int num1) {this.num1 = num1;}public int getNum2() {return num2;}public void setNum2(int num2) {this.num2 = num2;}
    }class SumJisuan extends Jisuan {@Overridepublic int getResult() {return getNum1() + getNum2();}}class SubJisuan extends Jisuan {@Overridepublic int getResult() {return getNum1() - getNum2();}
    }class MulJisuan extends Jisuan {@Overridepublic int getResult() {return getNum1() * getNum2();}
    }class DevJisuan extends Jisuan {@Overridepublic int getResult() {int result = 0;if (getNum2() != 0) {result = getNum1() / getNum2();}return result;}
    }
  9. 企业级应用中,我们对数据库的实现就可以采用上述模式
    实际上,我们再加上其他表,IFactory中再增加createXXXFactory就成了抽象工厂模式了,抽象工厂只是比工厂方法多了一个纬度而已

public class GongChangMethodTest {public static void main(String[] args) {IFactory factory=new MysqlUserFactory();IUserService service=factory.createUserService();service.insert();}
}	
interface IUserService{void insert();
}
class UserService implements IUserService{@Overridepublic void insert() {System.out.println("insert 方法");}
}
interface IFactory{public IUserService createUserService();
}	
abstract class MysqlFactory implements IFactory{//这里可以做一些初始化mysql连接的事情
}
abstract class SqlServerFactory implements IFactory{//这里可以做一些初始化mysql连接的事情
}
//如果想换成sqlserver,只需要加一个SqlserverUserFactory就可以了
class MysqlUserFactory extends MysqlFactory{@Overridepublic IUserService createUserService() {return new UserService();}}



























转载于:https://my.oschina.net/u/2323537/blog/636408

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

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

相关文章

[转]IPython介绍

1. IPython介绍 ipython是一个python的交互式shell,比默认的python shell好用得多,支持变量自动补全,自动缩进,支持bash shell命令,内置了许多很有用的功能和函数。学习ipython将会让我们以一种更高的效率来使用python…

.NET MAUI in Mac

点击上方蓝字关注我们(本文阅读时间:4分钟)概要本篇文章主要分享MAUI在m1芯片的设备上运行和支持情况,将我们写好的MAUI程序编译为支持mac平台的版本。在m1芯片刚刚出来的时候有很多开发工具和应用程序对m1芯片的支持不是很友好&a…

30分钟时长千行代码《C#程序设计基础》经典程序,C#菜鸟开发必备!

作者:刘一哥GIS(CSDN博客专家) 博客地址:https://geostorm.blog.csdn.net/ 刘一哥,多年研究地图学、地理信息系统、遥感、摄影测量和GPS等应用,精通ArcGIS、MapGIS、ENVI、Erdas、CASS、Pix4d、CC、PhotoScan、Inpho、EPS、Globalmapper等专业软件的应用,精通多门编程语…

前端开发中的SEO

前端开发中的SEO 什么是SEO SEO由英文Search Engine Optimization缩写而来,中文意译为“搜索引擎优化”。SEO是指从自然搜索结果获得网站流量的技术和过程,是在了解搜索引擎自然排名机制的基础上,对网站进行内部及外部的调整优化,…

grep命令

请见附件;转载于:https://blog.51cto.com/11203760/1750457

windows 常用系统变量

常用: %USERPROFILE% C:\Users\用户名 %SystemRoot% C:\WINDOWS %SystemDrive% C: %APPDATA% C:\Users\用户名\AppData\Roaming %LOCALAPPDATA% C:\Users\用户名\AppData\Local %windir% C:\WINDOWS %Path% C:\Windows\system32;C:\Wi…

C# 自定义并动态切换光标

本文经原作者授权以原创方式二次分享,欢迎转载、分享。原文作者:唐宋元明清的博客原文地址:https://www.cnblogs.com/kybs0/p/14873136.html系统有很多光标类型 :Cursors 类 (System.Windows.Input) | Microsoft Docs[1]本章介绍如…

HTML基础加强

1. 什么是浏览器:解释和执行HTML源码的工具。 2. 什么是静态页面,什么样的页面是动态页面? 静态页面:htm,html(直接读取) 动态网页:asp,aspx,jsp,…

视频播放器for android

写在前面 好久没有写博客了, 中间忙了一堆杂七杂八的事情...工作, 情感, 未来, 人生... 下面是正文 一直要写一个视频播放器, 好练练手. 这个app, 从年前写到现在, 终于算弄出了样子, 0.0版本. (不得不说, googleVPN值得拥有, android developer网站, android sdk samples, sta…

我要偷偷学习C#,然后学习GIS二次开发之试题汇总(附答案)

一、单项选择题(每小题2分,共20分) 在类作用域中能够通过直接使用该类的( )成员名进行访问。 A. 私有 B. 公用 C. 保护 D. 任何 答案:D 小数类型(decimal)和浮点类型都可以表示小数,正确说法:( ) A. 两者没有任何区别 B. 小数类型比浮点类型取值范围大 C.小数类型比浮…

简单粗暴无需拼接下载 blob (ts)视频文件

网上很多视频采用blob来播放视频&#xff0c;查看源码会发现video的src为形如 &#xff1a; src"blob:https://*/f2880c6a-c2c5-4146-96b2-944ae555b76a" <video id"" class"" preload"auto" playsinline"playsinline"…

System.CommandLine版CSRebot

之前自己实现过一个CSRebot命令行工具&#xff0c;现在用System.CommandLine来实现&#xff0c;就规范和省事多了&#xff0c;虽然System.CommandLine还没有正式发布&#xff0c;但它的实现思路还是很不错的。下面的代码只简单实现了MSSQL库生成C#体类的功能&#xff0c;其他库…

Shell重定向

Liunx下系统打开的3个文件&#xff0c;即标准输入、标注输出和标准错误输出。用户的shell将键盘设为默认的标准输入&#xff0c;默认的标准输入和标准错误输出为屏幕。也就是说&#xff0c;用户从键盘输入命令&#xff0c;然后将结果和错误消息输入到屏幕所谓的重定向&#xff…

【CASS精品教程】CASS 9.2 for AutoCAD2014启动提示文件加载,怎么处理?

CASS9.2在安装完后,首次启动会提示如下图样提示,应该如何处理?请看以下步骤: 解决步骤: 1、安装完CASS9.2_2014后,首次启动CASS92,会出现如下图所示提示。选择“不加载”。 2、进入AutoCAD系统配置—系统页面 打开系统页面菜单 系统界面截图

VS2015不能修改安装路径问题

能修改安装路径&#xff0c;固态硬盘空间太小&#xff0c;所以不能装在C盘啊。 其中&#xff0c;原因是以前安装过VS2015没有卸载干净&#xff0c;解决方法是&#xff1a;下载Visual Studio Uninstaller卸载完全&#xff08;要以管理员运行哈&#xff09; 下载地址&#xff1a;…

python 绘制分形树

# -*- coding: utf8 -*- """ 绘制分形树 """ import turtledeflection_angle 20 # 树枝与树干夹角 trunk_min_length 5 # 树干最小长度 trunk_step_length 10 # 树干每次递减长度 trunk_length 80 # 初…

像JAVA一样流畅调试C#源代码?

起因最近在研究ServiceScope的内一些内在运行逻辑,发现相关资料非常少&#xff0c;只有讲IOC相关的文章有说Core时代的官方依赖注入怎么使用。。遂决定还是要去看源代码。这部分源代码在Microsoft.Extensions.DependencyInjection库中&#xff0c;源代码位置在src/libraries[1]…

物化视图VS普通视图

2019独角兽企业重金招聘Python工程师标准>>> 物化视图是一种特殊的物理表&#xff0c;“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表&#xff0c;应用的局限性大&#xff0c;任何对视图的查询&#xff0c;Oracle都实际上转换为视图SQL语句的查…

【CASS精品教程】CASS绘图软件入门初级教程超详细资料

文章目录 第一章 CASS 9.0简介第二章 CASS 9.0快速入门第三章 测制地形图第四章 测制地籍图第五章 土地详查与勘测定界第六章 CASS在数据入库中的应用第七章 CASS 9.0在工程中的应用第八章 数字地图管理第九章 CASS在市政监管中的应用第十章 白纸图数字化第十一章电子平板成图第…

多兼容的JS获取鼠标坐标

//第一、相对于屏幕 function getMousePos(event) {var e event || window.event;return {x:e.screenX,y:screenY} } //第二、相对于浏览器 function getMousePos(event) {var e event || window.event;return {x:e.clientX,y:clientY} }//第三、相对于文档 function getM…