首页 > 其他分享 >设计模式--1.0.2

设计模式--1.0.2

时间:2024-06-11 21:43:44浏览次数:21  
标签:draw 1.0 -- 工厂 对象 Shape Circle 设计模式 public

工厂模式

Version 1.0.2

工厂模式提供一种创建对象的方式,而无需指定要创建的具体类。

通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和扩展性。

意图

定义一个创建对象的接口,让其子类决定实例化哪一个具体的类。工厂模式使对象的创建过程延迟到子类。

主要解决问题

接口选择的问题

关键代码

对象的创建过程在子类中实现

实例

  1. 汽车制造:你需要汽车,只需要从工厂中提货,而不需要关心汽车的制造过程及其内部实现

  2. Hibernate:更新数据库时,只需要更改方言和数据库驱动,即可实现对不同数据库的切换

优点

  1. 调用者只需要知道对象的名称即可创建对象

  2. 扩展性高,如果需要增加新产品,只需要扩展一个工厂类

  3. 屏幕了产品的具体实现,调用者只关心产品的接口

缺点

每次增加一个产品时,需要增加一个具体类和对应的工厂,使系统中类的数量成倍增加,增加系统的复杂性和具体类的依赖

使用场景

  1. 日志记录:日志可能记录到本地硬盘,系统事件,远程服务器等,用户可以选择记录日志的位置

  2. 数据库访问:当用户不知道最终系统使用哪种数据库,或者数据库可能变化时

  3. 连接服务器的框架设计:需要支持“POP3”,"IMAP","HTTP"三种协议,可以将这三种协议做为产品类,共同实现一个接口

注意事项

工厂模式适用于生成复杂对象的场景。如果对象较为简单,通过new即可创建,则不必使用工厂模式。使用工厂模式会引入一个工厂类,增加系统复杂度

实现

创建一个Shape接口和实现Shape接口的实体类。下一步是定义工厂类ShapeFactory.

FactoryPatternDemo类使用ShapeFactory来获取Shape对象。它将向ShapeFactory传递消息,以便获取它所需对象的类型

// 创建一个接口Shape.java

public interface Shape{
  void draw();
}

创建实现接口的实体类

// Rectangle.java

public class Rectangle implements Shape{
  
  @Override
  public void draw(){
    System.out.println("Inside Rectangle::draw() method.");
  }
}
// Square.java
public class Square implements Shape{

  @Override
  public void draw(){
    System.out.println("Inside Square::draw() method.");
  }
}
// Circle.java

public class Circle implements Square{
  
  @Override
  public void draw(){
    System.out.println("Inside Circle::draw() method.");
  }
}

创建一个工厂,生成基于给定消息的实体类的对象

// ShapeFactory.java
public class ShapeFactory{

// 使用getShape方法获取形状类型的对象
  public Shape getShape(String shapeType){
    if(shapeType == null){
      return null;
    }
    if(shapeType.equalsIgnoreCase("CIRCLE")){
      return new Circle();
    }else if(shapeType.equalsIgnoreCase("RECTANGLE")){
      return new Rectangle();
    }else if(shapeType.equalsIgnoreCase("SQUARE")){
      return new Square();
    }
    return null;
  }
}

使用该工厂,通过传递类型消息来获取实体类的对象

// FactoryPatternDemo.java
public class FactoryPatternDemo{
  public static void main(String[] args){
    ShapeFactory shapeFactory = new ShapeFactory();

    // 获取Circle的对象,并调用它的draw()方法
    Shape shape1 = shapeFactory.getShape("CIRCLE");
    // 调用Circled的draw()方法
    shape1.draw();

    // 获取Circle的对象,并调用它的draw()方法
    Shape shape2 = shapeFactory.getShape("RECTANGLE");
    // 调用Circled的draw()方法
    shape2.draw();

    // 获取Circle的对象,并调用它的draw()方法
    Shape shape3 = shapeFactory.getShape("SQUARE");
    // 调用Circled的draw()方法
    shape3.draw();
  }
}

标签:draw,1.0,--,工厂,对象,Shape,Circle,设计模式,public
From: https://www.cnblogs.com/data101/p/18242800

相关文章

  • 多进程并发简易服务器代码实现
    多进程实现并发服务器多进程并发服务器.c架构intsockfd=socket()bian()listen()while(1){ acceptfd=accept() pid=fork() if(pid>0){ }elseif(pid==0){ while(1){ recv()/send() } }}注意:accept不能放在P......
  • 第五章:多态、抽象类、虚函数、虚函数表
    一、虚函数:1.1虚函数的概念:被virtual修饰的类成员函数称为虚函数。通过重写虚函数,可以实现多态。        1.2如何重写虚函数:派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表类型完全相同),称子类的虚函数重......
  • 【esp32 学习笔记】让SD卡发光发热~
    原理图:图 SD卡部分图MCU中与SD卡相关的接口连接关系如下:[ESP32IO26–CSMICROSD][ESP32IO23–MOSI(DI)MICROSD][ESP32IO19–MISO(DO)MICROSD][ESP32IO18–SCKMICROSD][ESP32GND–GNDMICROSD][3.3V–VCCMICROSD] 软件:我们将使用SD卡库用于沟......
  • 植物大战僵尸杂交版2.0.88最新防闪退版+修改工具+高清全屏工具
    打开后发现是小屏幕的那怎么才能全屏呢全屏游戏教程1.回到解压后的文件夹,鼠标右击【Magpiev0.5.2】压缩包,选择【解压到当前文件夹】。2.打开【Magpie_v0.5.2】文件夹,双击运行【magpie】程序。3.这里大家选择适合自己的模式,然后点击【五秒后放大】。注:部分电脑可能出现......
  • 计树 Normal --
    无聊的水题。无聊的水题IDLS喜欢上树。但是他并不想把一道数据结构题出到树上,他喜欢计Tree。这一天,他想自己造一棵树,他手头有\(N\)个树的节点,标号为\(1\simN\),他会在它们之间连边,我们定义两颗树不同,当且仅当一对节点在一棵树中有连边,另一棵树中没有连边。但他不喜欢......
  • Adobe Acrobat Pro DC2023软件安装教程、安装包下载
    软件简介AcrobatDC是一个功能强大的PDF编辑软件,它可以将任何纸质文件转换为可编辑的电子文件,用于传输、签署和分享,并且提供了一系列强大的功能来编辑PDF文档。软件下载复制链接在浏览器打开即可下载https://www.qqres.com/2248.html安装步骤1.打开解压后的文件夹,鼠......
  • 利用聚合API平台的API接口,利用HTTP协议向服务器发送请求,并接受服务器的响应,要求利用cJ
    目录题目分析代码结果题目利用聚合API平台的API接口,利用HTTP协议向服务器发送请求,并接受服务器的响应,要求利用cJSON库对服务器的响应数据进行解析,并输出到终端分析1.需从源代码网站GitHub或SourceForge代码网站下载cJSON库及阅读下载的README相关手册如何使用cJSON库;2.使用......
  • 初始化三板斧 - centos7
    1、关闭防火墙、关闭SELinux①立即关闭防火墙systemctlstopfirewalld②设置开机关闭防火墙systemctldisablefirewalld③立即关闭SELinxusetenforce0④设置开机关闭SELinux将SELINUX=enforcing 修改替换为SELINUX=disabledvim/etc/selinux/configsed‘s......
  • Dragon Boat Festival
    TheDragonBoatFestival,alsoknownastheDuanwuFestival,isasignificantculturaleventinChina.Itfallsonthefifthdayofthefifthlunarmonth,atimewhenfamiliesgathertocelebrateandcommemoratetheancientpoetQuYuan.Itisapitythat......
  • 小程序中的事件处理
    事件处理一个应用仅仅只有界面展示是不够的,还需要和用户做交互,例如:响应用户的点击、获取用户输入的值等等,在小程序里边,我们就通过编写JS脚本文件来处理用户的操作1.事件绑定和事件对象小程序中绑定事件与在网页开发中绑定事件几乎一致,只不过在小程序不能通过on的方......