设计模式、原则、饿汉式单例模式、抽象工厂、代理模式、观察者模式、模板方法模式使用场景

本文详细介绍了设计模式的关键元素,包括模式名称、问题、解决方案和效果,并探讨了设计原则,如开闭原则、里氏替换原则等。文章深入分析了单例模式、工厂模式(简单工厂、工厂方法、抽象工厂)的差异,以及代理模式的三种实现方式。此外,还讨论了模板方法模式和观察者模式的使用场景。
摘要由CSDN通过智能技术生成

设计模式

​ 对各种面向对象方法的一种总结。前辈们遇到了好多设计问题,然后利用面向对象解决了。然后他们把解决方案汇总起来,形成了20多种设计模式。它可以有效的帮助我们利用面向对象,来提高代码的复用性、扩展性等。

设计模式4个关键元素

  • 模式名称:就是设计模式的名字。
  • 问题:就是当面对什么样的设计问题时,应该采用该设计模式。即该设计模式的应用场景
  • 解决方案:该设计模式是使用什么样的方案解决的。
  • 效果:最后解决后,效果怎么样。比如扩展性怎么样,复用性怎么样。优缺点等等

设计原则

  • 开闭原则

    ​ 对扩展开放,对修改关闭。就是如果要修改原有的功能或者是扩展功能,尽量去扩展原有的代码,而不是修改原来已有的代码。

  • 里氏替换原则(Liskov Substitution Principle)

    ​ 任何子类对象都应该可以替换其派生的超类对象 。即,子类可以扩展父类的功能,但不要修改父类原有的功能。 也就是说,当一个子类继承父类后,尽量不要去重写它原有的方法。

  • 依赖转置(依赖倒置)原则

    ​ 要面向接口编程,不要面向实现编程。两个模块交互时,都访问各自接口,而不是具体的实现类。

  • 单一职责原则

    ​ 一个对象要专注于一种事情,不要让它担任太多责任。

  • 接口隔离原则

    ​ 一个接口尽量只包含用户关心的内容。就是一个接口不要太庞大。

  • 迪米特法则

    ​ 如果两个软件实体之间不是特别必要,尽量不要让他们直接通信。而是找个第三方进行转发,比如使用MQ(消息队列)。

  • 合成复用原则

    ​ 如果在“组合/聚合”和“继承”之间做抉择时,优先选择“组合/聚合”。

设计模式的分类

  1. 创建型模式:单例模式、原型模型、工厂模式、建造者模式

    ​ 用于创建对象的设计模式。一般可以简化用户创建对象的过程。其次可以降低耦合度,用户不需要关心对象具体的创建过程。

  2. 结构型模式:代理模式、适配器模式、桥接模式、装饰器模式

    ​ 组织对象之间的结构,使其易于扩展等。

  3. 行为型模式:模板方法模式、策略模式、状态模式、观察者模式

    ​ 主要用于决定对象如何做出行为。

创建型模式

单例模式

  • 模式名称:单例,单个实例。整个应用程序只需要一个实例即可。
  • 问题:有很多情况下,只需要一个实例即可。现实生活中,地球、中国等,如果创建这些实例,那么只需要一个即可。 在代码世界中,全局上下文、线程池、连接池这些对象,在整个程序中也是只需要一个实例即可。
  • 解决方案:禁止用户new该对象。只能通过你提供的静态方法来获取该对象。而你的静态方法返回的都是同一实例。
  • 效果:避免用户new多个没用的对象。提高了系统性能
//调用代码
Singleton singleton1 = Singleton.getInstance();

//单例模式
class Singleton {
   
    private static Singleton instance = new Singleton();
    public static Singleton getInstance() {
   
        return instance;
    }
}
/*
*懒汉模式,synchronized保证线程安全
*重点是懒。系统运行初期并不把该单例对象实例化,而是等第一次使用的时候再进行实例化
*/
public static synchronized LazySingleton getInstance() {
   
    //getInstance 方法前加同步
    if (instance == null) {
   
        instance = new LazySingleton();
    }
    return instance;
}
/*
*饿汉模式
*重点是饿,也就是饥渴。还没到用的时候,就先实例化了,等到用的时候直接就可以用了
*/
private static final HungrySingleton instance = new HungrySingleton();
public static HungrySingleton getInstance() {
   
    return instance;
}

应用场景

  1. 系统中只有一个任务管理器

  2. JDK中的单例:java.lang.Runtime:允许应用程序与运行应用程序的环境进行交互。可以从getRuntime方法获取当前运行时, Runtime.getRuntime().totalMemory() 返回JVM(Java虚拟机)中的总内存量

  3. Spring Bean 作用域

工厂模式

简单工厂模式
  • 模式名称:和生活中的工厂一样,通过工厂来生产产品(对象),而不是自己手动new。
  • 问题:把需求给工厂说,然后工厂给你生产,比如我想要黄色的衣服,工厂就给我生产一个黄色的衣服。 在程序中也一样,我通过工厂类,提出我的需求(传递参数),然后工厂类帮我new相应的对象,返回给我。
  • 解决方案:定义一个抽象对象(如动物),然后定义一个工厂类,工厂类封装了生产具体动物(当然这些具体动物要继承动物类)的方法。然后你通过参数传递给工厂类,比如要一只汪汪叫的动物,然后工厂方法就会return new Dog()。
  • 效果:用户不必关心对象怎么生产的,甚至不用关心这个具体对象是什么。工厂的生产规则可以写入配置文件,这样修改时就不需要动代码了。
class Factory {
   
    public static String createProduct(String product) {
   
        String result = null;
        switch (product) {
   
            case "Mocca":
                result = "摩卡";
                break
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值