前言
工厂模式介绍
一般情况下,我们会把工厂模式分为三种变体,1. 简单工厂 2. 工厂方法 3. 抽象工厂,平常开发过程中使用最多的一般是前面两种方式,相对于抽象工厂而言原理要简单一些。
⚠️ 重点:工厂模式的核心便是关于封装对象的创建
目录
简介
定义
工厂方法模式( Factory Method Pattern)隶属于创建型,原理主要是工厂父类主要负责定义产品创建的公共接口,而工厂子类主要负责生产具体的产品。
特点
工厂类用来创造具体的产品,外部无需知道产品的创造细节,只需要向工厂索要产品。产品的创造由工厂自行决定,所以工厂只做与之相关的产品创建,进而也方便的系统的扩展。但由于新建产品需要添加新的工厂,所以系统的抽象性和复杂度也随之而来。
理解实现
现实模型
大家都知道我喜欢吃水果,也经常在老乡哪里买水果,所以老乡是越来越富有了😭,开起了水果专卖店还请了一批美女销售员。但是我不仇富,还是经常会买一些🍍、🥭、🍇、🥝、🍉,一开始我都是在一个水果店买老乡的水果,现在我要找各个专卖店的美女买水果了。还是下班前买,吃完它们后开始写水文了。
分析模型
主线:我去老乡的专卖店买水果,美女销售员给我,吃完写水文。
模型1: 我 -> 消费者
模型2: 水果店专卖店 ->具体产品工厂
模型3: 美女销售员 -> 创建产品
模型4: 水果们 -> 产品
我(消费者[shuaige])
一周七天,周一到周五上班摸鱼比较费脑子,又不敢提桶,只能买水果补补,不然怎么卷的过各位大佬。
class Me:ShuaiGe{
fun eatFruit(){
(1..7).forEach{
when(it){
1->PineappleFruitStore().createFtuit()
2->MangoFruitStore().createFtuit()
3->GrapeFruitStore().createFtuit()
4->KiwiFruitStore().createFtuit()
5->WatermelonFruitStore().createFtuit()
else-> println("周末没赚钱不准吃水果")
}
}
}
老乡的水果专卖店(具体产品工厂)
老乡还是非常体谅我上班辛苦,对我的要求都是有求必应的,知道我家境清寒,还有心提醒我周末没有赚钱。
class PineappleFruitStore:FruitStore(){
override fun createFtuit():Fruit=Pineapple()
}
class MangoFruitStore:FruitStore(){
override fun createFtuit():Fruit = Mango()
}
class GrapeFruitStore:FruitStore(){
override fun createFtuit():Fruit = Grape()
}
class KiwiFruitStore:FruitStore(){
override fun createFtuit():Fruit = Kiwi()
}
class WatermelonFruitStore:FruitStore(){
override fun createFtuit():Fruit = Watermelon()
}
美女销售员(创造产品)
interface FruitStore{
fun createFtuit():Fruit
}
水果们(产品)
这些就是本帅喜欢的水果了,也就吃的起这些便宜的水果。
class Pineapple:Fruit(){}
class Mango:Fruit(){}
class Grape:Fruit(){}
class Kiwi:Fruit(){}
class Watermelon:Fruit(){}
使用实例
以网络响应解析器功能来说,系统网络请求有多种传输协议规则,有json,xml,yaml,自然我们只需要提供一个解析方法,根据不同的传输协议创建不同的解析器。
抽象协议解析工厂
interface IProtocolParserFactory {
fun createProtocolParser():IProtocolParser
}
JSON解析器工厂
class JsonProtocolParserFactory : IProtocolParserFactory {
override fun createProtocolParser():IProtocolParser {
return JsonProtocolParser();
}
}
XML解析器工厂
class XmlProtocolParserFactory : IProtocolParserFactory {
override fun createProtocolParser():IProtocolParser {
return XmlProtocolParser();
}
}
YAML解析器工厂
class YamlProtocolParserFactory : IProtocolParserFactory {
override fun createProtocolParser():IProtocolParser {
return YamlProtocolParser();
}
}
适用环境
如果无法预知对象确切类别及其依赖关系时,可使用工厂方法