创建型的模式主要关注的点是:怎么样去创建对象。它的特点就是将对象的创建和使用进行分离。这样的话可以降低耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成,就像我们去商场购买商品时,不需要知道商品是怎么生产出来一样,因为它们由专门的厂商生产。
创建型模式分为以下几种。
- 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。
- 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。
- 工厂方法(FactoryMethod)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。
- 抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
- 建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
以上 5 种创建型模式,除了工厂方法模式属于类创建型模式,其他的全部属于对象创建型模式,我们将在之后的教程中详细地介绍它们的特点、结构与应用。
单例模式的介绍
1.懒汉模式
package com.lishuai.singleton;
/**
* 单例模式的懒汉模式
* 特点:在类加载的时候不会创建对象实例,只有在第一次访问的时候才会创建实例。
* 并且存在多线程的安全问题
*/
public class LazySingleton {
private static volatile LazySingleton instance = null;
private LazySingleton(){}
public static synchronized LazySingleton getInstance(){
if(instance==null){
return new LazySingleton();
}
return instance;
}
}
上面这个模式虽然是线程安全得但是效率不高,即使你写成双重判断得加锁形式也还是效率不高,所以最优解一般推荐静态内部类来实现,这个可以说是单例模式得最优解了
package com.lishuai.singleton;
/**
* 单例模式的懒汉模式
* 特点:在类加载的时候不会创建对象实例,只有在第一次访问的时候才会创建实例。
* 并且存在多线程的安全问题
*/
public class LazySingleton {
/**
* 这个实现方法是最有解
* 实现了延迟加载同时也避免了多线程竞争效率得问题
* 因为匿名内部类在使用得时候才会被加载,否则不会被加载
* 因为jvm会保证静态成员只会被加载一次
*/
private static class Sigle{
private static LazySingleton INSTANCE=new LazySingleton();
}
private LazySingleton(){
System.out.println("....");
}
public static LazySingleton getInstance(){
System.out.println("创建对象");
return Sigle.INSTANCE;
}
}
2.饿汉模式
package com.lishuai.singleton;
/**
* 单例模式的饿汉模式
* 不存在现成安全的问题
* 只是在类加载的时候对象就已经创建好了
*/
public class HungrySingleton {
private static final HungrySingleton HUNGRY_SINGLETON=new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance(){
return HUNGRY_SINGLETON;
}
}