设计模式-创建型-简单工厂模式 今天吃啥水果?

设计模式-创建型-简单工厂模式.png

前言

工厂模式介绍

一般情况下,我们会把工厂模式分为三种变体,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("没有对应的登录方式")
        }
        }
        }
}

适用环境

工厂需要创建的对象相对很少,由于创建少,对于工厂方法的业务逻辑便不会过于复杂,导致后期维护成本增加。

你可能感兴趣的:(设计模式-创建型-简单工厂模式 今天吃啥水果?)