厦门网站建设制作工具,网站建设投资预算,成都知名建筑公司排名,郏县网站制作公司文章目录 单例模式饿汉式单例模式懒汉式单例模式双重检索单例模式 工厂模式简单工厂模式工厂#xff08;方法#xff09;模式抽象工厂模式 原型模式代理模式 单例模式 确保一个类只有一个实例#xff0c;并且自行实例化并向整个系统提供这个实例。 饿汉式单例模式
饿汉式单… 文章目录 单例模式饿汉式单例模式懒汉式单例模式双重检索单例模式 工厂模式简单工厂模式工厂方法模式抽象工厂模式 原型模式代理模式 单例模式 确保一个类只有一个实例并且自行实例化并向整个系统提供这个实例。 饿汉式单例模式
饿汉式单例模式在类加载的时候完成了实例化因为我们将构造函数设为了私有所有其他的对象不能通过new类创建这个类的实例然后提供了一个公共的静态方法返回这个类的唯一实例。因为只有一个实例化对象所以不存在线程安全问题在平时不能通过new进行对象的创建只能通过给定的那个全局访问点通过类名进行调用 /*** 饿汉式单例模式*/
public class SingletonPattern {// 在类加载时完成了实例化private static SingletonPattern singletonPattern new SingletonPattern();// 私有化构造函数防止其他对象使用new创建该类的对象private SingletonPattern() {}// 提供一个公共的静态方法返回该类的唯一实例public static SingletonPattern getSingletonPattern() {return singletonPattern;}
} 懒汉式单例模式
懒汉式单例在类加载的时候不创建对象在第一次使用的时候进行创建这样创建的优点是如果该单例对象在系统中没有被使用那么就不会造成资源的浪费。但是懒汉式单例会出现线程安全问题当多线程访问时有可能出现多个线程同时if就会创建出多个对象。 /*** 懒汉式单例模式*/
public class SingletonPattern1 {// 初始化一个null对象private static volatile SingletonPattern1 singletonPattern null;// 私有化构造函数防止别的对象使用new创建该类的对象private SingletonPattern1() {}// 提供一个公共的静态方法返回该类的唯一实例public static SingletonPattern1 getSingletonPattern() {if (singletonPattern null) {singletonPattern new SingletonPattern1();}return singletonPattern;}
}要解决这个线程安全的问题可以有两种方式第一种是给方法加锁但是给方法加锁之后一次只能获取到一个线程效率较低。第二种是给代码块加锁需要使用双重检索
双重检索单例模式
既提高了效率又提高了安全性使用双重if的原因是当只有一个if时如果锁加载if代码块的外面这时候和加载方法上是一样的效率低如果加在if内这是后如果并发量大几个线程同时进行if然后进入if虽然内部代码被锁包裹但是已经进入的线程一个接一个执行仍然会创建出多个对象此时需要给内部代码块再加一层if这时候即提高了效率又提高了安全性。
/*** 双重检索单例模式*/
public class SingletonPattern2 {// 初始化一个null对象private static SingletonPattern2 singletonPattern null;// 私有化构造函数防止别的对象使用new创建该类的对象private SingletonPattern2() {}// 提供一个公共的静态方法返回该类的唯一实例public static SingletonPattern2 getSingletonPattern() {if (singletonPattern null) {synchronized (SingletonPattern2.class) {if (singletonPattern null) {singletonPattern new SingletonPattern2();}}}return singletonPattern;}
} 此时问题并没有完全解决我们知道一个对象创建的过程主要分为三步分配内存初始化对象指向刚分配的地址但是第二步和第三步由于CPU的优化可能会产生排序我们一般认为执行顺序为123但是可能会先执行3再执行2这时候的对象是一个半成品对象但是也不是null所以此时的情况并没有完全解决需要添加volatile只有当所有步骤都执行完之后才会将对象的地址传给引用参数。 工厂模式
简单工厂模式
简单工厂模式又称为静态工厂方法模式它属于类创建型模式。在简单工厂模式中可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责其他类的实例被创建的实例通常都具有共同的父类。优点是实现对象的创建和使用分离创建完全交给专门的工厂类去负责程序员不关心怎么创建只关心怎么使用。缺点是工厂类不够灵活如果新增一个产品就要修改工厂类就要修改它的判断逻辑如果产品很多的话这个逻辑就会非常复杂。比如就是一台咖啡机可以理解为一个工厂模式你只需要按下想喝的咖啡品类的按钮他就会给你生产一杯相应的咖啡你不需要管他的内部具体实现只需要告诉它你的需求。 工厂方法模式
简单工厂模式当有新产品加入时必须要修改工厂类需要在其中加入必要的业务逻辑这违反了开闭原则没有办法做到灵活扩展。工厂方法模式定义一个用于创建对象的接口让子类决定实例化那个类。工厂方法使一个类的实例化延迟到其子类。 在工厂模式中之前的核心工厂变成了一个抽象接口负责给出工厂应该实现的方法它不在负责所有产品的创建将具体产品的创建交给子类去做这样就诞生了具体的子工厂子工厂即子类负责生成具体的产品对象这样做可以将产品类的实例化操作延迟到工厂子类中完成即通过工厂子类来确定究竟应该实例化哪一个具体产品类在现在的工厂模式中如果需要新增一个产品不需要修改原有的工厂类逻辑但是需要新增一个工厂这样看起来比较复杂但是在面向对象语言中需要遵循开闭原则就是程序对于扩展是开放的对于修改时封闭的 Collection就是一个常见的工厂方法模式其中Collection就是抽象工厂具体工厂时LinkedList和ArrayList抽象产品就是Iterator具体产品就是ListItr和Itr。
抽象工厂模式 抽象工厂模式可以使具体工厂类可以创建多个大类对象但是还需要修改抽象工厂和具体工厂的代码违反开闭原则。
原型模式
原型模式属于创建型模式用来创建一个已有的对象的完全相同的复制品。这个时候如果直接复制的话需要创建一个相同类的对象然后遍历原始对象的所有成员变量以及所有属性然后将这些变量的值复制到新的对象中但是这个对象的某些成员变量是私有的不对外公开或没有提供访问器那么外部是没有办法去复制的并且对象实现的某个接口传给我们时我么你只知道它的某个接口的实现类他具体的类是哪一个这是不知道的。那么原型模式就是去解决复制对象的问题的原型模式将这个复制过程称之为克隆原型模式就是将这个克隆的过程委派给被克隆的实际对象由这个被克隆的对象自己去负责克隆原型模式为所有被克隆的对象提供了一个通用接口原型对象需要克隆的话就去实现这个接口clone就在克隆方法中去实现自己的克隆逻辑。
代理模式 代理模式就是为其他对象提供一种代以控制这个对象的访问。例黄牛买票婚介 代理模式分为静态代理和动态代理动态代理又分为JDK代理和CGLIB动态代理 优点是代理模式能够协调调用者和被调者在一定程度上降低系统的耦合度并且可以灵活的隐藏被代理对象的部分功能和服务也增加了额外的功能和服务缺点就是使用代理模式程序没有直接调用性能高并且使用代理模式提高了代码的复杂度。