前言
工厂模式介绍
一般情况下,我们会把工厂模式分为三种变体,1. 简单工厂 2. 工厂方法 3. 抽象工厂,平常开发过程中使用最多的一般是前面两种方式,相对于抽象工厂而言原理要简单一些。
⚠️ 重点:工厂模式的核心便是关于封装对象的创建
目录
设计模式-创建型-简单工厂模式
设计模式-创建型-工厂方法模式
设计模式-创建型-抽象工厂模式
简介
定义
简单工厂模式(Simple Factory Pattern)隶属于创建型,原理主要是定义一个类来根据参数负责创建不同类的实例,这些需要被创建的不同类通常会有共同的父类。
特点
工厂类包含了所有创建实例的判断逻辑,由工厂内部自行决定创建,外部只需要消费实例即可,这种做法简单的实现了责任的划分。但由于逻辑的集中冗余确实也增加了系统复杂程度,不利于后期的扩展和维护。
概要
一个工厂,一个抽象产品,多个具体产品,每个具体产品都出自一个工厂。
理解实现
现实模型
我喜欢吃水果,我经常在小区门口那家老乡的水果店买,我经常会买一些、、、、,一开始每次我都需要自己去挑水果,但是我800度的又不太好使,所以出于对老乡的信任吧,我就在下班的时候给老乡发条微信消息,告诉他我今天想吃啥水果,下班后就去店里拿着该买的水果就回家了,吃完它们后我就开始写水文了。
分析模型
主线:我告诉老乡我要吃,老乡给我,吃完写水文。
模型1: 我 -> 消费者
模型2: 老乡的水果店 ->工厂
模型3: 水果们 -> 产品
我(消费者[shuaige])
一周七天,周一到周五上班摸鱼比较费脑子,又不敢提桶,只能买水果补补,不然怎么卷的过各位大佬。
class Me:ShuaiGe{
private val fruitStore: FruitStore by lazy {FruitStore()}
fun eatFruit(){
(1..7).forEach{
val fruit = fruitStore.buyFruit(it)
println("吃$fruit")
println("写水文")
}
}
}
老乡的水果店(工厂)
老乡还是非常体谅我上班辛苦,对我的要求都是有求必应的,知道我家境清寒,还有心提醒我周末没有赚钱。
class FruitStore(){
fun buyFruit(name:Int):Fruit{
return when(name){
1->Pineapple()
2->Mango()
3->Grape()
4->Kiwi()
5->Watermelon()
else-> {
println("周末没赚钱不准吃水果")
MeiQianGuo()
}
}
}
}
水果们(产品)
这些就是本帅喜欢的水果了,也就吃的起这些便宜的水果。
class Pineapple:Fruit{}
class Mango:Fruit{}
class Grape:Fruit{}
class Kiwi:Fruit{}
class Watermelon:Fruit{}
class MeiQianGuo:Fruit{}
使用实例
以应用的登录功能来说,系统需要支持各种登录方式,如口令登录、会员登录,那么自然的做法就是建立一个各种登录方式都适用的接口
抽象产品Login
interface Login {
//登录验证
fun verify(name:String,password:String):Boolean
}
具体产品TokenLogin
class TokenLogin : Login {
override fun verify(name:String,password:String):Boolean {
/**口令相关业务逻辑*/
return true
}
}
具体产品MemberLogin
class MemberLogin : Login {
override fun verify(name:String,password:String):Boolean {
/**会员相关业务逻辑*/
return true
}
}
工厂类LoginFactory
根据调用者不同的要求,创建出不同的登录对象并返回。而如果碰到不合法的要求,会返回一个Runtime异常。
class LoginFactory {
fun factory(type:Int):Login{
return when(type){
1->TokenLogin()
2->MemberLogin()
else-> {
throw Exception("没有对应的登录方式")
}
}
}
}
适用环境
工厂需要创建的对象相对很少,由于创建少,对于工厂方法的业务逻辑便不会过于复杂,导致后期维护成本增加。