单例模式、原型模式、工程模式、建造者模式,它们是以创建对象为目的的设计模式,它们也被称为创建型构建模式。
其中工厂模式、建造者模式之前已经介绍过,可以查看往期内容:
工厂模式 Factory Pattern 、 建造者模式 Builder Pattern
单例模式 Singleton Pattern
Singleton Pattern 是 Java 中最简单的设计模式,它提供了自己创建自己唯一实例的能力。
一个简单的演示
演示代码
// 一个简单类
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
// 测试类
public class SingletonTest {
@org.junit.Test
public void getInstace() {
Singleton singleton = Singleton.getInstance();
System.out.println(singleton.toString());
Singleton singleton02 = Singleton.getInstance();
System.out.println(singleton02.toString());
Singleton singleton03 = Singleton.getInstance();
System.out.println(singleton03.toString());
System.out.println(singleton == singleton02);
System.out.println(singleton02 == singleton03);
}
}
运行结果
虽然运行结果都是同一对象实例,但是演示案例并不是一个优秀的单例模式。JDK 1.5 版本以后,单例模式的使用首推枚举类,枚举类简单易用,还满足多线程安全。
原型模式 Prototype Pattern
Prototype Pattern 是一种常用的 Java 设计模式,它提供了对象实例拷贝的能力。
一个简单的演示
演示代码
// 抽象类提供 clone 方法
public abstract class Car implements Cloneable {
protected String brand;
private String name;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", name='" + name + '\'' +
'}';
}
}
// 具体类
public class Benz extends Car {
public Benz() {
brand = "Benz";
}
}
public class Bwm extends Car {
public Bwm() {
brand = "Bwm";
}
}
// 缓存原型
public class CarPrototype {
private static Map<String, Car> cars = new HashMap<>();
public static void loadCar() {
Car benz = new Benz();
benz.setName("梅赛德斯");
cars.put("Benz", benz);
Car bwm = new Bwm();
bwm.setName("宝马");
cars.put("Bwm", bwm);
}
public static Car getCar(String brand) throws CloneNotSupportedException {
Car car = cars.get(brand);
return (Car)car.clone();
}
}
// 测试类
public class CarPrototypeTest {
@org.junit.Test
public void getCar() throws CloneNotSupportedException {
CarPrototype.loadCar();
Car bwm = CarPrototype.getCar("Bwm");
System.out.println(bwm.toString());
Car bwm02 = CarPrototype.getCar("Bwm");
System.out.println(bwm02.toString());
System.out.println(bwm == bwm02);
}
}
运行结果
总结
将对象的创建与使用分离,使用者不需要了解对象创建的内部逻辑。通过这样的设计模式,来实现系统内部的解耦。