目录
前言
单例模式是一种常用的软件设计模式,其核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。
原型模式是一种创建型设计模式,它复制或克隆对象,同时又能保护原始对象的内部结构。原型模式通过返回对象的一个拷贝来实现对象的创建,这种方式比直接new一个对象在某些情况下更为高效。
构造器模式常用用于处理具有复杂构造过程的对象的创建。在软件工程中,当一个对象需要多个部件协同工作时,直接实例化对象可能会导致构造方法过于复杂,且难以维护。构造器模式通过将对象的构造过程封装在一个独立的对象中(称为构造器),来分步骤、逐渐构建复杂对象,使得最终对象的创建过程更加清晰、灵活。
正文
单例模式要点
- 私有化构造函数:确保外部不能直接实例化。
- 提供一个静态方法:这个方法用于返回这个类的唯一实例。
单例模式代码
在Kotlin中,实现单例模式非常简单,因为Kotlin原生支持单例模式,通过object
关键字即可定义一个单例。
// 使用object关键字定义单例
object Singleton {
var counter = 0
fun increment() {
counter++
}
}
fun main() {
println(Singleton.counter)
Singleton.increment()
println(Singleton.counter)
}
Java如下,基本的饿汉式方法:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
原型模式实现步骤
- 实现
Cloneable
接口:这样做是为了告诉Object.clone()
方法,该对象可以被安全地克隆。 - 重写
clone()
方法:在clone()
方法内部,调用super.clone()
来获取对象的一个字段到字段的复制。
原型模式示例代码
public class PrototypePatternDemo {
static class Sheep implements Cloneable {
String name;
int age;
Sheep(String name, int age) {
this.name = name;
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Sheep{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public static void main(String[] args) {
try {
Sheep original = new Sheep("Jolly", 3);
System.out.println(original);
Sheep cloned = (Sheep) original.clone();
System.out.println(cloned);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
默认的clone()
方法提供的是浅拷贝,如果对象中包含对其他对象的引用,那么复制的将是引用地址,而不是引用对象本身的拷贝。在需要深拷贝的情况下,需要在clone()
方法中手动实现深拷贝逻辑。
构造器模式基本组成
- 产品(Product):最终要创建的复杂对象。
- 构造器(Builder):接口或抽象类,定义了创建产品各个部分的方法。
- 具体构造器(Concrete Builder):实现构造器接口的类,具体实现创建产品各个部分的方法。每一个具体构造器都能构造出不同表现(属性)的产品。
- 指导者(Director):负责安排复杂对象的构造过程,接受一个构造器对象作为起点,通过调用构造器提供的方法来完成复杂对象的创建。它知道构造器需要调用哪些方法来构造产品的各个部分。
构造器模式例子
将构建一个汽车
对象作为产品(Product),汽车
对象包含几个基本特征:品牌、型号和颜色。我们将定义一个汽车构造器
接口,具体的构造器将实现这个接口来构建不同特征的汽车
对象。最后,我们使用一个指导者类来控制构造过程。
产品类和构造器接口
// 产品类
class Car(var brand: String? = null, var model: String? = null, var color: String? = null) {
override fun toString(): String {
return "Car(brand=$brand, model=$model, color=$color)"
}
}
// 构造器接口
interface CarBuilder {
fun setBrand(brand: String): CarBuilder
fun setModel(model: String): CarBuilder
fun setColor(color: String): CarBuilder
fun build(): Car
}
构造器类
class ConcreteCarBuilder : CarBuilder {
private val car = Car()
override fun setBrand(brand: String): CarBuilder {
car.brand = brand
return this
}
override fun setModel(model: String): CarBuilder {
car.model = model
return this
}
override fun setColor(color: String): CarBuilder {
car.color = color
return this
}
override fun build(): Car {
return car
}
}
使用如下
fun constructSportsCar(): Car {
return builder.setBrand("Ferrari")
.setModel("488 Spider")
.setColor("Red")
.build()
}
结尾
设计模式的英文是什么?Design pattern,这是一个非常之准确的词汇,个人认为比中文翻译好太多了。
Patten中文释义:. n. 模式;图案;样品. vt. 模仿pattern往往意味着是一种既定的准则,从它的动词可以看到,他有模仿的意思,也就是说,这样的代码设计,是一系列前人留下的经验,只要跟着这样写代码,往往能够让你的代码,更加简洁,更加健壮,更加优雅!
我觉得他应该有个意译的名字,叫做:代码设计的最佳实践!