首页 > 其他分享 >工厂方法设计模式

工厂方法设计模式

时间:2023-06-19 16:33:50浏览次数:43  
标签:GeometricShape draw 绘制 工厂 形状 println 设计模式 方法 public


工厂方法模式使我们能够在不将创建逻辑暴露给客户端的情况下创建对象,并使用通用接口引用新创建的对象。它是最广泛使用的创作模式之一。

此模式也称为  虚拟构造函数

根据 Gamma等人的Design Patterns,这种模式的目的  是:

  • 定义用于创建对象的接口,但让子类决定实例化哪个类。Factory方法允许类将实例化延迟到子类。

Factory方法用于创建对象。超类指定所有标准和通用行为,然后将创建详细信息委托给客户端提供的子类。

Factory方法使设计更具可定制性,而且更复杂一些。其他设计模式需要新类,而Factory只需要新操作。

结构体

工厂方法模式的结构如下图所示:

图:工厂方法模式的结构

如今,static 类的  方法通常用作返回所需类类型的对象的工厂方法。与构造函数不同,它返回的实际对象可能是子类的实例,也可能重用现有对象,而不是创建新对象。

使用a factory 代替a的一个  优点  constructor 是  factory 方法可以具有不同的和更具描述性的名称。

让我们考虑一个根据客户需求绘制不同几何形状的应用程序。应用程序的类图如下所示:

图:工厂方法模式示例

所述  ShapeFactory 类具有静态方法getShape(),它返回  GeometricShape 字符串名称输入的基础上对象。

Java实现

我们已经介绍了上面讨论的应用程序的Java实现。

让我们首先为产品制作一个接口factory

/ ***产品界面* /公共 界面 GeometricShape {void  draw();} 
以下是上述接口的实现:
/ ***混凝土产品* /public  class  Line  实现 GeometricShape {@覆盖public  void  draw(){系统。出。println(“Line Drawn。”);}}/ ***混凝土产品* /public  class  Rectangle  实现 GeometricShape {@覆盖public  void  draw(){系统。出。println(“绘制矩形。”);}}/ ***混凝土产品* /public  class  Circle  实现 GeometricShape {@覆盖public  void  draw(){系统。出。println(“绘制圆圈”。);}} 
我添加了以下枚举来命名形状:
public  enum  ShapeType {LINE,CIRCLE,RECTANGLE,三角形} 
现在,让我们创建一个  factory 提供产品的产品(在本例中  GeometricShape):
/ ***混凝土产品* /公共 抽象 类 ShapeFactory {public  static  GeometricShape  getShape(ShapeType  name){GeometricShape  shape  =  null ;开关(名字){案例 LINE:shape  =  new  Line();打破 ;案例 CIRCLE:shape  =  new  Circle();打破 ;案例 RECTANGLE:shape  =  new  Rectangle();打破 ;}回归 形状 ;}} 
应用程序的客户端提供所需形状的名称,如下所示。
/ ***客户* /公共 类 申请 {public  static  void  main(String [] args){//请求圆形GeometricShape  circle  =  ShapeFactory。getShape(ShapeType。CIRCLE);if(circle  !=  null){圈子。draw();} else {系统。出。println(“此形状无法绘制。”);}//请求不存在的形状GeometricShape  triangle  =  ShapeFactory。getShape(ShapeType。三角);if(triangle  !=  null){三角形。draw();} else {系统。出。println(“此形状无法绘制”);}}} 
该计划的输出是:
圈 被 绘制。这个 形状 可以“吨绘制

由于存在圆形,Circle 因此返回有效  对象。但是,没有带三角形的类,因此无法绘制形状。

结论

这篇文章用一个简单的例子讨论了作为GOF模式之一的Factory方法模式的总结形式。 

上面提供的所有示例的源代码都可以在GitHub上  找到

快乐的编码!

标签:GeometricShape,draw,绘制,工厂,形状,println,设计模式,方法,public
From: https://blog.51cto.com/u_16145034/6515638

相关文章

  • Linux建立虚拟ip的方法
    1、虚拟ip的介绍 虚拟IP地址(VIP)是一个不与特定计算机或一个计算机中的网络接口卡(NIC)相连的IP地址。数据包被发送到这个VIP地址,但是所有的数据还是经过真实的网络接口。上边是百度的定义。就是一块网卡上边有两个ip,然后无论到哪个ip的流量都会经过物理网卡。 2、虚拟i......
  • java~搞懂Comparable接口的compareTo方法
    Comparable接口的compareTo方法的升序或降序取决于实现该接口的类的具体实现。按照惯例,compareTo方法应该返回负数、零或正数来指示当前对象是小于、等于还是大于传入的对象。具体来说:如果this对象小于传入的对象,则compareTo应该返回负数。如果this对象等于传入的对......
  • Android-Kotlin-GET/SET 方法的使用
    上篇博客我们讲了kotlin的继承,今天接着往下讲解kotlin的get/set方法的使用。Student.ktpackagecn.kotlin.kotlin_oop04openclassPerson{openvarpersonName:String="我是父类的名字"}classStudent:Person(){/***name用private私有修饰,外界其他地方......
  • 通过API接口获取到数据后的使用方法以及储存方法
    API接口是许多应用程序和服务所必需的,可以将多个应用程序连接起来,允许不同应用程序之间的数据共享。在本文中,我们将探讨如何使用API接口获取数据,以及如何储存这些数据。1.使用API接口获取数据在获取API数据之前,我们需要确定API接口的URL和参数。该URL通常由API提供程序提供,并列......
  • 2023-06-19《计算方法》- 陈丽娟 - 方程的近似解法(注解)
    2023-06-19《计算方法》-陈丽娟-方程的近似解法(注解)Matlab计算方法二分法迭代法牛顿法前面介绍了求解方程的二分法、迭代法和牛顿迭代法,这里介绍弦截法,欸特金加速法。一、弦截法由于牛顿迭代法需要计算导数,而从上一章节我们看到导数的求解对数值稳定性会产生不良影响,为了......
  • 关于flutter框架安卓应用抓包问题,以及解决方法
    参考文档https://bbs.kanxue.com/thread-261941.htm一.从安装的app所在文件夹目录中提出libflutter.socd/data/app/包名/lib/xxx/..../...libflutter.so二.将其拖入ida中进行分析字符串窗口搜索ssl_server按x进入F5看了一下和上面博客说的相似不理解上面说的也......
  • 在 JavaScript 中,判断一个对象是否为空有几种方法。
    使用Object.keys()方法检查对象的键值对数量:functionisObjectEmpty(obj){returnObject.keys(obj).length===0;}//示例用法constobj1={};console.log(isObjectEmpty(obj1));//输出:trueconstobj2={name:'John',age:25};console.log(isObjectEm......
  • 异步操作的方法和技术
    异步操作是一种编程模式,用于处理那些可能耗时的任务,以确保应用程序在执行这些任务的同时能够继续响应其他操作。下面是一些常见的异步操作的方法和技术:回调函数(Callbacks):这是一种传统的异步编程模式,其中函数在完成任务后调用预定义的回调函数。回调函数允许在异步操作完成后执......
  • 一个执行计划异常变更的案例 - 外传之查看绑定变量值的几种方法
    这篇外传之前有这么几篇文章:《一个执行计划异常变更的案例-前传》《一个执行计划异常变更的案例-外传之绑定变量窥探》上一篇文章介绍了绑定变量以及11g之前绑定变量窥探的影响,这篇文章会介绍几种查看绑定变量值的方法。上篇文章我们说了,绑定变量实际是一些占位符,可以让仅......
  • nginx限制并发数和限制下载速度方法
    以下代码写在nginx配置规则里面,宝塔面板的用户可以直接在宝塔里面修改。http{limit_conn_zone$binary_remote_addrzone=perip:10m;...server{...location/{limit_connperip1;limit_rate_after500m;limit_rate200k;}limit_conn_zone$binary_remote_addr:加......