设计模式——创建型(5种)
抽(抽象工厂方法模式)工(工厂方法模式)单(单例模式)建(建造者模式)原(原型模式)
抽象工厂方法模式
提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
例子:不同厂家生产不同的电脑
abstract class Computer { abstract val name: String } class Dell : Computer() { override val name = "Dell" } class Asus : Computer() { override val name = "Asus" } class Acer : Computer() { override val name = "Acer" } class DellFactory : AbstractFactory() { override fun produce(): Computer = Dell() } class AsusFactory : AbstractFactory() { override fun produce(): Computer = Asus() } class AcerFactory : AbstractFactory() { override fun produce(): Computer = Acer() } abstract class AbstractFactory() { abstract fun produce(): Computer companion object { inline operator fun <reified T : Computer> invoke(): AbstractFactory = when (T::class) { Dell::class -> DellFactory() Asus::class -> AsusFactory() Acer::class -> AcerFactory() else -> throw IllegalArgumentException() } } } fun main() { println(AbstractFactory<Dell>().produce().name) println(AbstractFactory<Asus>().produce().name) println(AbstractFactory<Acer>().produce().name) } 复制代码
工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory
Method使一个类的实例化延迟到了子类。
例子:同一个厂生产不同的产品
abstract class Factory { abstract fun <T : Product> createProduct(cl: Class<T>): Product? } abstract class Product { abstract fun showInfo() } class ConcreateProductA : Product() { override fun showInfo() { println("I am concreate procuct A") } } class ConcreateProductB : Product() { override fun showInfo() { println("I am concreate procuct B") } } class ConcreateFactory : Factory() { override fun <T : Product> createProduct(cl: Class<T>): Product? { return Class.forName(cl.name).newInstance() as? T } } fun main() { val factory = ConcreateFactory() val productA = factory.createProduct(ConcreateProductA::class.java) productA?.showInfo() val productB = factory.createProduct(ConcreateProductB::class.java) productB?.showInfo() } 复制代码
单例模式
确保某一个类只有一个示例,而且自行实例化并向整个系统提供这个实例。
饿汉式
object Singleton1 { fun test() { println("我是饿汉\n") } } 复制代码
懒汉式
class Singleton2 private constructor() { companion object { // 内部使用DCL(Double Check Lock)双重校验锁实现 val instance: Singleton2 by lazy { Singleton2() } } fun test() { println("我是懒汉") } } 复制代码
使用
fun main() { Singleton1.test() Singleton2.instance.test() } 复制代码
建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
例子:创建一台电脑
class Computer { private lateinit var cpu: String private lateinit var ram: String private var usbCount: Int? = null private var keyboard: String? = null private var display: String? = null companion object { fun builder(cpu: String, ram: String): Builder { return Builder(cpu, ram) } } override fun toString(): String { return "cpu=$cpu\nram=$ram\nusbCount=$usbCount\nkeyboard=$keyboard\ndisplay=$display\n" } class Builder(cpu: String, ram: String) { private val computer = Computer() init { computer.cpu = cpu computer.ram = ram } fun setUsbCount(usbCount: Int): Builder { computer.usbCount = usbCount return this } fun setDisplay(display: String): Builder { computer.display = display return this } fun build(): Computer { return computer } } } val computer = Computer.builder(cpu = "intel", ram = "1") .setDisplay("1") .setUsbCount(3) .build() 复制代码
kotlin提供了更简便的方式
// 更简单的方法 data class Computer1( var cpu: String, var ram: String, var usbCount: Int? = null, var keyboard: String? = null, var display: String? = null ) val computer1 = Computer1("intel", "1").apply { usbCount = 1 } 复制代码
原型模式
用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象。
data class Email(var recipient: String, var subject: String?, var message: String?) val email = Email("abc@qq.com", "hello", "hahahahha") val copy = email.copy(recipient = "123@qq.com") fun main() { println("email = $email\n") println("copy email = $copy") }
作者:应用软件开发爱好者
链接:https://juejin.cn/post/7021034453136834574