设计模式

1.单例模式

单例模式的定义就是确保某一个类只有一个实例,并且提供一个全局访问点。 属于设计模式三大类中的创建型模式。
单例模式具有典型的三个特点:

  • 只有一个实例。
  • 自我实例化。
  • 提供全局访问点。

常见的单例模式实现方式有五种:饿汉式、懒汉式、双重检测锁式、静态内部类式和枚举单例。

1. 饿汉模式

第一步:构造器私有化,外部不能new
第二步:本类内部创建静态对象实例
第三步:提供一个公有的静态方法,返回对象实例

饿汉模式在类加载的时候就对实例进行创建,实例在整个程序周期都存在。它的好处是只在类加载的时候创建一次实例,不会存在多个线程创建多个实例的情况,避免了多线程同步的问题。
缺点: 即使这个单例没有用到也会被创建,而且在类加载之后就被创建,内存就被浪费了。

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

2.懒汉模式(线程安全)

public class Singleton{
    private static Singleton instance = null;
    private Singleton(){}
    public static synchronized Singleton newInstance(){
        if(null == instance){
            instance = new Singleton();
        }
        return instance;
    }
}
第一步:构造器私有化,外部不能new
第二步:本类内部创建静态对象实例,先赋值为空
第三步:提供一个synchronized 修饰的公有静态方法,如果实例为空,new一个对象实例返回

缺点:加锁的懒汉模式看起来即解决了线程并发问题,又实现了延迟加载,然而它存在着性能问题,依然不够完美。synchronized修饰的同步方法比一般方法要慢很多
3.双重校验锁

public class Singleton {
    private static volatile Singleton instance = null;
    private Singleton(){}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
第一步:构造器私有化,外部不能new
第二步:本类内部创建静态对象实例,先赋值为空
第三步:提供一个的公有静态方法getInstance,如果实例为空,对单例的class类用synchronized 修饰,判断实例为空,new一个对象实例返回

4.常见应用场景

网站计数器。
项目中用于读取配置文件的类。
数据库连接池。因为数据库连接池是一种数据库资源。
Spring中,每个Bean默认都是单例的,这样便于Spring容器进行管理。
Servlet中Application
Windows中任务管理器,回收站。

2.工厂模式

工厂模式分为简单工厂模式,工厂方法模式、抽象工厂模式,
其主要功能都是帮助我们把对象的实例化部分抽取了出来,目的是降低系统中代码耦合度,并且增强了系统的扩展性。
1.简单工厂模式
简单工厂模式中工厂负责生产所有产品,需要有一个产品接口,其次是具体的产品去实现这个接口,然后有一个Factory工厂类来生产这些产品。
最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码逻辑将会非常复杂。
2.工厂方法模式
和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂。当系统需要新增一个产品是,无需修改现有系统代码,只需要添加一个具体产品类和其对应的工厂子类,使系统的扩展性变得很好
3.抽象工厂
此模式是对工厂方法模式的进一步扩展。在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,但是,如果需要一个具体的工厂生产多种产品对象,那么就需要用到抽象工厂模式了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值