1.单例模式
确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建模式。
1.1 饿汉式单例类
当类被加载时,静态变量instance被初始化,此时类的私有构造函数会被调用,单例类的唯一实例将被创建。但是不管用不用得到,这个实例都被创建,占用内存空间。
对应的Java片段:
class EagerSingleton{
private static final EagerSingleton instance = new EagerSIngleton();
private EagerSingleton() {}
public static EagerSingleton getInstance(){
return instance
}
}
1.2 懒汉式单例类
带有双重检查锁定(Double-Check Locking)的懒汉式单例类。
对应的Java片段:
class LazySingleton{
private volatile static LazySingleton instance = null;
private LazySingleton() {}
public static LazySingleton getInstance() {
if (instance == null){
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new LazySingleton();
}
}
}
return instance;
}
}
1.3 IoDH单例
结合前两种单例模式的优点。在实现IoDH时,需要在单例类中增加一个静态内部类,在该内部类中创建单例对象,再将该单例对象通过getInstance方法返回给外部使用。
对应的Java片段:
class Singleton{
private Singleton() {}
private static class HolderClass {
private final static Singleton instance = new SIngleton();
}
private static Singleton getInstance() {
return HolderClass.instance;
}
public class void main(String args[]) {
Singleton s1, s2;
s1 = Singleton.getInstance();
s2 = Singleton.getInstance();
System.out.println(s1 == s2);
}
}
结果必定是true。单例模式的适用场景:系统只需要一个实例对象;客户调用类的单个实例只允许适用一个公共访问点。
2.简单工厂模式
定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法,因此又称为静态工厂模式,属于类创建型模式。
工厂模式结构:
(1)Factory(工厂角色):即工厂类,模式的核心,负责创建所有产品实例的内部逻辑。工厂类可直接被外界调用,创建所需的产品对象。在类中提供了静态工厂方法factoryMethod(),返回类型为产品类型Product。
(2)Product(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法。
(3)ConcreteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每个具体产品角色都继承了抽象产品角色Product,需要实现在抽象产品中声明的抽象方法。
对应的Java片段:
abstract class Product {
//调用所有产品类的公共业务方法
public void methodSame(){
//公共方法的实现
}
//声明抽象业务方法
public abstract void methodDiff();
}
class ConcreateProduct extends Product{
//实现业务方法
public void methodDiff(){
//业务方法的实现
}
}
class Factory{
//静态工厂方法
public static Product getProduct(String arg){
Product product = null;
if(arg.equalslgnoreCase("A")){
product = new ConcreateProductA();
}
else if(arg.equalslgnoreCase("B")){
product = new ConcreateProductB();
}
return product
}
}
//客户端代码调用
class Client{
public static void main(String arg){
Product product;
product = Factory.getFactory("A");
product.methodSame();
product.methodDiff();
}
}
3.工厂方法模式
定义一个用于创建对象的接口,让子类决定将那一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又称为工厂模式、虚拟构造器模式、多态工厂模式。
工厂方法模式结构:
在工厂模式结构图中包含以下4个角色:
(1)Product(抽象产品):它是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类。
(2)ConcreteProduct(具体产品):它实现了冲徐昂产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间意义对应。
(3)Factory(抽象工厂):在抽象工厂类中,声明了工厂方法(Factory Method),用于返回同一个产品。抽象工厂是工厂方法模型的核心,所有创建对象的工厂类都必须实现该接口。
(4)ConcreteFactory(具体工厂):它是抽象工厂类的子类,实现了抽象工厂类中定义的工厂方法,并可由客户端调用,返回一个具体产品类的实例。
代码参考:https://github.com/Onecat-j/JavaProjects