常用设计模式之单例模式、策略模式、工厂模式

ops/2024/10/19 1:01:38/

单例模式

单例模式属于创建型模式

饿汉模式:立即加载

public class Singleton {  private static Singleton instance = new Singleton();  private Singleton (){}  public static Singleton getInstance() {  return instance;  }  
}

懒汉模式,懒加载

  • 线程不安全

    public class Singleton {private static Singleton instance;private Singleton (){}public static Singleton getlnstance() {if (instance == null){instance = new Singleton();}return instance;}
    }
  • 线程安全

    public class Singleton {  private static Singleton instance;  private Singleton (){}  public static synchronized Singleton getInstance() {  if (instance == null) {  instance = new Singleton();  }  return instance;  }  
    }

  • 双重锁

    public class Singleton {  private volatile static Singleton singleton;  private Singleton (){}  public static Singleton getSingleton() {  if (singleton == null) {  synchronized (Singleton.class) {  if (singleton == null) {  singleton = new Singleton();  }  }  }  return singleton;  }  
    }
  • 静态内部类

    public class Singleton {private Singleton() {}//内部类在外部类调用的时候才会被初始化// 内部类一定要在方法调用之前初始化private static class SingletonInstance {private static final Singleton instance = new Singleton();}// static 使单例空间共享// final使得方法不能被重写重载public static final Singleton getInstance() {return SingletonInstance.instance;}
    }

策略模式

策略模式属于行为型模式

核心思想是对算法进行封装,委派给不同对象来管理。

比如我们旅游可以选择出行的策略有:自行车、电动车、公交车等-

  • 结构

    策略模式饱汉三种类:

    角色关系作用
    抽象策略类strategy是所有类的父类定义一个公共接口,定义一些算法标识和抽象方法
    具体策略concrete strategy是抽象策略的接口实现类实现抽象策略定义的抽象方法,描述具体法的算法实现
    环境context维护一个抽象策略类的引用实例委托策略变量,调用具体策略所实现的抽象策略接口中的方法

工厂模式

概念

工厂模式,提供一种创建对象的方式,

在创建对象时提供一种封装机制,将实际创建对象的代码与使用代码分离

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

不暴露对象创建逻辑的情况下创建对象

主要解决接口选择问题

角色

抽象产品:产品的共同接口或抽象类

具体产品:实现了抽象产品接口

抽象工厂:声明创建产品的抽象方法

具体工厂实现抽象工厂接口

分类

分为:简单工厂、方法工厂、抽象工厂

实现

  • 简单工厂
//简单工厂:每创建一个产品就会增加一个对应的具体的工厂类
// 违背了开闭原则,不属于23种GOF
public class Test {public static void main(String[] args) {Baozi baozi = SimpleFactory.createBaozi("jiangrou");System.out.println(baozi.createBaozi());Baozi baozi1 = SimpleFactory.createBaozi("jiangrou");System.out.println(baozi1.createBaozi());}
}
​
//抽象工厂
interface Baozi {String createBaozi();
}
​
//产品的具体的实现
class JiangRou implements Baozi {@Overridepublic String createBaozi() {return "酱肉";}
}
​
class XianRou implements Baozi {@Overridepublic String createBaozi() {return "鲜肉";}
}
​
//工厂类是关键
//判断要做什么包子,整个做包子的生产都被这个工厂类封装起来了
//用户不需要关注这里面的细节
//适合创建对象比较少的情况,只需传递具体参数,忽略生产细节
class SimpleFactory {public static Baozi createBaozi(String type) {switch (type) {case "jiangrou":return new JiangRou();case "xianrou":return new XianRou();}return null;}
}
  • 方法工厂
//工厂方法:定义一个用于创建产品的接口,由子类决定生产什么产品
//如果还有其他类型的包子,需要在SimpleFactory里面加判断,因为只能在那里生产包子,违反开闭原则
//是简单工厂的的抽象,抽象一个工厂接口,
//增加新产品时,需要增加新的工厂
//一个工厂只生产一种产品
public class Test {public IPhone getPhoneGrete(String type){if ("huawei".equals(type)){HuaWeiPhoneFactory huaWeiPhoneFactory = new HuaWeiPhoneFactory();IPhone phone = huaWeiPhoneFactory.createPhone();return phone;}if ("xiaomi".equals(type)){XiaomiPhoneFactory xiaomiPhoneFactory = new XiaomiPhoneFactory();IPhone phone = xiaomiPhoneFactory.createPhone();return phone;}return null;}public IPC getPcCreate(String type){if ("huawei".equals(type)){HuaWeiPCFactory huaWeiPCFactory = new HuaWeiPCFactory();IPC pc = huaWeiPCFactory.createPC();return pc;}if ("xiaomi".equals(type)){XiaomiPCFactory xiaomiPCFactory = new XiaomiPCFactory();IPC pc = xiaomiPCFactory.createPC();return pc;}return null;}public static void main(String[] args) {Test test = new Test();IPC huawei = test.getPcCreate("huawei");IPC xiaomi = test.getPcCreate("xiaomi");IPhone xiaomi1 = test.getPhoneGrete("xiaomi");}
}
//抽象产品
interface IPhone {void createPhone();
}
interface IPC {void createPC();
}
interface ISW {void createSW();
}
//具体的产品
class HuaWeiPhone implements IPhone {@Overridepublic void createPhone() {}
}
class XiaoMiPhone implements IPhone {@Overridepublic void createPhone() {}
}
class HuaWeiPC implements IPC {@Overridepublic void createPC() {}
}
class XiaoMiPC implements IPC {@Overridepublic void createPC() {}
}//手机工厂
interface PhoneAbstractFactory {IPhone createPhone();
}
//电脑工厂
interface PCAbstractFactory {IPC createPC();
}
//华为手机工厂
class HuaWeiPhoneFactory implements PhoneAbstractFactory {@Overridepublic IPhone createPhone() {return new HuaWeiPhone();}
}
//华为电脑工厂
class HuaWeiPCFactory implements PCAbstractFactory {@Overridepublic IPC createPC() {return new HuaWeiPC();}
}
//小米手机工厂
class XiaomiPhoneFactory implements PhoneAbstractFactory {@Overridepublic IPhone createPhone() {return new XiaoMiPhone();}
}
//小米电脑工厂
class XiaomiPCFactory implements PCAbstractFactory {@Overridepublic IPC createPC() {return new XiaoMiPC();}
}
  • 抽象工厂
//一个工厂可以生产不同产品等级的产品族
public class Test  {public static void main(String[] args) {HuaweiFactory huaweiFactory = new HuaweiFactory();huaweiFactory.createPhone();huaweiFactory.createPC();XiaomiFactory xiaomiFactory = new XiaomiFactory();xiaomiFactory.createPhone();xiaomiFactory.createPC();}
}//抽象产品族
interface Phone {void createPhone();
}interface PC {void createPC();
}interface SWI {void createSWI();
}//具体产品族
class XiaoMiPhone implements Phone {@Overridepublic void createPhone() {System.out.println("小米手机");}
}
class XiaoMiSWI implements SWI {@Overridepublic void createSWI() {System.out.println("小米手表");}
}class HuaweiPhone implements Phone {@Overridepublic void createPhone() {System.out.println("华为手机");}
}class XiaoPC implements PC {@Overridepublic void createPC() {System.out.println("小米电脑");}
}class HuaweiPC implements PC {@Overridepublic void createPC() {System.out.println("华为电脑");}
}//抽象工厂,一个工厂可以生产不同产品等级的产品族
abstract class AbstractFactory {public abstract Phone createPhone();public abstract PC createPC();public abstract SWI ccreateSWI();
}//具体工厂
class HuaweiFactory extends AbstractFactory {@Overridepublic Phone createPhone() {return new HuaweiPhone();}@Overridepublic PC createPC() {return new HuaweiPC();}@Overridepublic SWI ccreateSWI() {return null;}
}
class XiaomiFactory extends AbstractFactory {@Overridepublic Phone createPhone() {return new XiaoMiPhone();}@Overridepublic PC createPC() {return new XiaoPC();}@Overridepublic SWI ccreateSWI() {return new XiaoMiSWI();}
}

对比

简单工厂

  • 优点

    • 屏蔽产品的具体实现,调用者只关心产品的接口

  • 缺点

    • 增加产品,需要修改工厂类,违反了开闭原则

    • 工厂类集中了所有的实例的创建逻辑,违反高内聚责任分配原则

工厂方法

  • 优点

    • 继承简单工厂的优点,符合开闭原则

  • 缺点

    • 增加产品时,需要增加工厂类

抽象工厂

  • 优点

    • 不需要知道什么产品被创建

    • 可以通过具体的工厂创建多个对象,增加新的具体工厂和产品族方便

  • 缺点

    • 增加新的产品等级就比较复杂,需要修改抽象工厂和所有的具体工厂类


http://www.ppmy.cn/ops/119876.html

相关文章

推荐一个可以把PDF样本册转换为翻页电子书的网站

​随着互联网的普及,越来越多的企业和个人开始意识到线上展览的重要性。如何将实体样本册转化为线上版本,让更多人了解和欣赏自己的产品与服务? 一、网站简介 这款PDF样本册免费上传网站名为“FLBOOK”,致力于为广大用户提供便捷…

CI/CD详细流程

CI/CD(持续集成/持续交付或持续部署)是一种软件开发实践,旨在通过自动化软件构建、测试和部署的过程,提高开发效率和软件质量。以下是CI/CD流程的详细说明: 1. 持续集成(CI) 持续集成的核心思想…

Pencils Protocol 全面推动市场,生态通证 DAPP 将持续通缩

随着 Pencils Protocol 在包括 Tokensoft、Bounce 以及 Coresky 等平台陆续完成 DAPP 的 IDO,同时 DAPP 同步在 Gate、Bitget、Bybit、Kucoin 几个平陆续上线并开启交易后,预示着 Pencils Protocol 生态经济体系全面开启运转。 而在 DAPP 开放交易后&…

mysql之函数

前言 讲函数 1. 字符串函数 1.1 concat select concat(Hello,aaaa);这个函数的作用就是拼接,当然也可以拼接多个 select就是打印的意思 1.2 lower select lower(Hello);大写转小写 1.2 upper 1.3 lpad select lpad(01,5,-);这个的意思就是在01字符串的左边…

基于J2EE技术的高校社团综合服务系统

目录 毕设制作流程功能和技术介绍系统实现截图开发核心技术介绍:使用说明开发步骤编译运行代码执行流程核心代码部分展示可行性分析软件测试详细视频演示源码获取 毕设制作流程 (1)与指导老师确定系统主要功能; (2&am…

MyISAM 简介

MyISAM是MySQL的一个存储引擎,以其高效的读取性能和简单的设计而闻名。以下是MyISAM的详细介绍,包括其优缺点、工作机制和使用场景。 1. 基本特性 存储结构:MyISAM使用三种文件来存储数据: .frm:表的格式文件。.MYD&a…

springboot的调度服务与异步服务实操

1.调度服务 1.1.JDK之ScheduledExecutorService 讲到调度任务,我们脑海里马上会想到ScheduledExecutorService。 ScheduledExecutorService是 Java java.util.concurrent 包中的一个接口,它继承自 ExecutorService 接口。它主要用于在给定的延迟后运行…

Springboot3保存日志到数据库

保存日志到数据库 请求日志几乎是所有大型企业级项目的必要的模块,请求日志对于我们来说后期在项目运行上线一段时间用于排除异常、请求分流处理、限制流量等。请求日志一般都会记录请求参数、请求地址、请求状态(Status Code)、SessionId、…