美文网首页
设计模式-创建型-简单工厂模式 今天吃啥水果?

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

作者: wuzhuoyu | 来源:发表于2022-04-16 23:14 被阅读0次
    设计模式-创建型-简单工厂模式.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("没有对应的登录方式")
            }
            }
            }
    }
    

    适用环境

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

    相关文章

      网友评论

          本文标题:设计模式-创建型-简单工厂模式 今天吃啥水果?

          本文链接:https://www.haomeiwen.com/subject/tflkertx.html