初探工厂抽象模式

news2024/12/23 9:08:04

设计模式的-工厂模式

工厂模式之抽象类

1.定义一个约定的规则抽象类   

class ETFactory {
     createStore() {
         throw new Error('抽象方法,不允许直接调用,需重写')
     }
     createUser(){
          throw new Error('抽象方法,不允许直接调用,需重写')
     }
}

案例:定义两个具体店铺

定义一个地址的抽象规则类 

class ETStore {
      getAddress() {
         throw new Error('抽象方法,需要重写')
      }
}

继承上面地址的抽象类,创建方法

万达具体实现类

class WandaStore extends ETStore{
      getAddress(){
        return console.log('万达金铺360号')
      }
}

万象城具体实现类       

 class WanxiangchengStore extends ETStore{
       getAddress(){
           return console.log('万象城1006号一层')
       }
}


定义:员工的抽象类     

class ETUser {
        getSkill(){
          throw new Error('抽象方法,需要重写')
        }
}

继承上面员工的抽象类,创建方法

spa技师具体实现类       

class SpaTech extends ETUser{
      getSkill(){
       return console.log('spa 技师:精油spa,香薰spa')
      }
}

按摩技师具体实现类 

class SofaTech extends ETUser{
      getSkill(){
        return console.log('按摩 技师:柔式按摩,瑜伽按摩')
      }
}

  定义一个具体的规则类     

class AchieveFactory extends ETFactory {
      createStore(){
          return new WandaStore()
      }
      createUser(){
         return new SpaTech()
      }
}

创建一个店铺:

// 开店喽
const Honghong = new AchieveFactory()
const store1 = Honghong.createStore()
const store2 = Honghong.createUser()

// 打印门店地址
store1.getAddress()
// 打印员工技能
store2.getSkill()

再创建一个新的店铺

还是用之前创建的方法

// 开新店喽
// 定义一个具体的规则类
class NewAchieveFactory extends ETFactory {
    createStore(){
        return new WanxiangchengStore()
    }
    createUser(){
        return new SofaTech()
    }
}

声明新的实例 

// 开分店喽
const Honghong1 = new NewAchieveFactory()
const store3 = Honghong1.createStore()
const store4 = Honghong1.createUser()

// 打印门店地址
store3.getAddress()
// 打印员工技能
store4.getSkill()

下面是全部代码

<script>
        // 定义一个约定的规则抽象类
        class ETFactory {
            createStore() {
                throw new Error('抽象方法,不允许直接调用,需重写')
            }
            createUser(){
                throw new Error('抽象方法,不允许直接调用,需重写')
            }
        }
        
        // 定义一个具体的规则类
        class AchieveFactory extends ETFactory {
            createStore(){
                return new WandaStore()
            }
            createUser(){
                return new SpaTech()
            }
        }


        // 定义一个抽象的规则类
        class ETStore {
            getAddress() {
                throw new Error('抽象方法,需要重写')
            }
        }
        // 定义两个具体店铺
        // 万达具体实现类
        class WandaStore extends ETStore{
            getAddress(){
                return console.log('万达金铺360号')
            }
        }

        // 万象城具体实现类
        class WanxiangchengStore extends ETStore{
            getAddress(){
                return console.log('万象城1006号一层')
            }
        }


        // 员工的抽象类
        class ETUser {
            getSkill(){
                throw new Error('抽象方法,需要重写')
            }
        }

        // spa技师具体实现类
        class SpaTech extends ETUser{
            getSkill(){
                return console.log('spa 技师:精油spa,香薰spa')
            }
        }

        // 按摩技师具体实现类
        class SofaTech extends ETUser{
            getSkill(){
                return console.log('按摩 技师:柔式按摩,瑜伽按摩')
            }
        }

        // 开店喽
        const Honghong = new AchieveFactory()
        const store1 = Honghong.createStore()
        const store2 = Honghong.createUser()

        // 打印门店地址
        store1.getAddress()
        // 打印员工技能
        store2.getSkill()

        // 开新店喽
        // 定义一个具体的规则类
        class NewAchieveFactory extends ETFactory {
            createStore(){
                return new WanxiangchengStore()
            }
            createUser(){
                return new SofaTech()
            }
        }

        // 开分店喽
        const Honghong1 = new NewAchieveFactory()
        const store3 = Honghong1.createStore()
        const store4 = Honghong1.createUser()

        // 打印门店地址
        store3.getAddress()
        // 打印员工技能
        store4.getSkill()

    </script>

参考资料:

JS设计模式_03工厂模式·抽象工厂 - 哔哩哔哩

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1843350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Codesys】-计算开机通电运行时间,累计正常使用时间,故障停机时间

应客户要求&#xff0c;在程序添加了这个用来计算开机运行时间&#xff0c;原理就是取当前时间减去一开始记录的时间&#xff0c;没什么特别要求&#xff0c;记录一下使用的变量类型和数据写法&#xff0c;防止忘记了。 下文只写了一个开机通电运行时间的写法&#xff0c;累计…

Java数据结构与算法——稀疏数组和队列

一、稀疏数组sparsearray数组 该二维数组的很多值是默认值0,因此记录了很多没有意义的数据&#xff0c;可以采用稀疏数组进行压缩 1.基本介绍: 当一个数组中大部分元素为0&#xff0c;或者为同一个值的数组时&#xff0c;可以使用稀疏数组来保存该数组。 稀疏数组的处理方法…

TikTok账号运营:静态住宅IP为什么可以防封?

静态住宅IP代理服务是一种提供稳定、静态IP地址并可隐藏用户真实IP地址的网络代理服务。此类代理服务通常使用高速光纤网络来提供稳定、高速的互联网体验。与动态IP代理相比&#xff0c;静态住宅IP代理的IP地址更稳定&#xff0c;被封的可能性更小&#xff0c;因此更受用户欢迎…

算法基础精选题单 模拟 (个人题解)

前言&#xff1a; 从今天开始刷牛客上的这份题单&#xff0c;为暑假的牛客多校集训做准备&#xff0c;题单上一共有237道题&#xff0c;要想在集训开始前刷完难度还是很大的&#xff0c;但我一定会坚持下来&#xff0c;希望在这段时间内我能真正入门算法竞赛。接下来这三道题都…

k8s学习--OpenKruise详细解释以及原地升级及全链路灰度发布方案

文章目录 OpenKruise简介OpenKruise来源OpenKruise是什么&#xff1f;核心组件有什么&#xff1f;有什么特性和优势&#xff1f;适用于什么场景&#xff1f; 什么是OpenKruise的原地升级原地升级的关键特性使用原地升级的组件原地升级的工作原理 应用环境一、OpenKruise部署1.安…

备忘录模式(大话设计模式)C/C++版本

备忘录模式 C #include <iostream> #include <string> using namespace std;// Memento类&#xff0c;备忘录&#xff0c;此处为角色状态存储箱 class RoleStateMemento { private:int m_vit; // 生命力int m_atk; // 攻击力int m_def; // 防御力 public:RoleStat…

基于SpringBoot+Vue流浪狗领养管理设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

眼见不一定为实之MySQL中的不可见字符

目录 前言 一、问题的由来 1、需求背景 2、数据表结构 二、定位问题 1、初步的问题 2、编码是否有问题 3、依然回到字符本身 三、深入字符本身 1、回归本质 2、数据库解决之道 3、代码层解决 四、总结 前言 在开始今天的博客内容之前&#xff0c;正在看博客的您先来…

如何更换OpenHarmony SDK API 10

OpenHarmony社区已经发布OpenHarmony SDK API 10 beta版本&#xff0c;有些 Sample案例 也有需要API10。那么如何替换使用新的OpenHarmony SDK API 10呢&#xff1f;本文做个记录。 1、如何获取OpenHarmony SDK 1.1 每日构建流水线 可以从OpenHarmony每日构建站点获取最新的…

【ARMv8/v9 GIC 系列 2 -- GIC SPI 中断的 enable和 disable 配置】

文章目录 GIC 中断 Enable 和 DisableGICD_ISENABLER<n>GICD_ICENABLER<n>参数 n使用举例代码实现注意事项 GIC 中断 Enable 和 Disable 在ARMv8架构中&#xff0c;通用中断控制器&#xff08;GIC&#xff09;负责管理处理器的中断。为了控制和管理这些中断&#…

SPI协议——对外部SPI Flash操作

目录 1. W25Q32JVSSIQ背景知识 1.1 64个可擦除块 1.2 1024个扇区&#xff08;每个块有16个扇区&#xff09; 1.3 页 1. W25Q32JVSSIQ背景知识 W25Q32JV阵列被组织成16,384个可编程页&#xff0c;每页有256字节。一次最多可以编程256个字节。页面可分为16组(4KB扇区清除&…

排序方法——《归并排序》

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;Yan. yan.                        …

chatgpt: linux 下用纯c 编写ui

在Linux下用纯C语言编写用户界面&#xff08;UI&#xff09;&#xff0c;通常会使用GTK或Xlib。GTK是一个更高级的库&#xff0c;提供了丰富的控件和功能&#xff0c;而Xlib则是一个更底层的库&#xff0c;提供了直接操作X Window系统的功能。 下面是一个使用GTK在Linux上创建…

第二十四节:带你梳理Vue2 : Vue具名插槽/作用域插槽/v-slot指令

1. 具名插槽 1.1 没有使用具名插槽的问题 有的时候我们在使用子组件时,在子组件模板上不同的位置插入不同的内容, 只有一个插槽显然没法满足我们的需求,看示例: 需求如下: 子组件是一篇文章的结构父组件在调用子组件是给文章插入标题,正文,时间信息 示例代码如下: <di…

随机森林算法详解

随机森林算法详解 随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;通过构建多个决策树并将它们的预测结果结合起来&#xff0c;来提高模型的准确性和稳定性。随机森林在分类和回归任务中都表现出色&#xff0c;广泛应用于各类机器学习问题。本文…

MySQL功能测试-之应用工程

MySQL功能测试-之应用工程 前言pom.xmlapplication.yml 文件common.vo 包ResultVO config 包properties 包DruidConfigPropertyDruidMonitorProperty AutoFillMetaObjectHandlerDruidConfigFluxConfigurationMyBatisPlusConfig controller 包ClientControllerDruidControllerWe…

Python开发日记--手撸加解密小工具(2)

目录 1. UI设计和代码生成 2.运行代码查看效果 3.小结 1. UI设计和代码生成 昨天讨论到每一类算法设计为一个Tab&#xff0c;利用的是TabWidget&#xff0c;那么接下来就要在每个Tab里设计算法必要的参数了&#xff0c;这里我们会用到组件有Label、PushButton、TextEdit、Ra…

RSA 加密算法的基础数论、基本原理与 Python 实现

Title: RSA 加密算法的基础数论、基本原理与 Python 实现 文章目录 前言I. 数学原理1. 整数环2. 单位元3. 欧拉定理 II. 算法原理1. 扩展欧几里得算法2. RSA 非对称加密算法 III. 算法实现1. 源代码2. 测试结果 总结参考文献 前言 1977 年美国 MIT 的三位数学家 Ronald L. Riv…

gunicorn超时报错[CRITICAL] WORKER TIMEOUT

一. 问题描述 2024-06-18T08:40:39.858804039Z [2024-06-18 08:40:39 0000] [1] [CRITICAL] WORKER TIMEOUT (pid:332) 2024-06-18T08:40:40.918093090Z [2024-06-18 08:40:40 0000] [1] [ERROR] Worker (pid:332) was sent SIGKILL! Perhaps out of memory?二. 原因分析 从…

企业如何做好供应链管理工作?8个步骤及应用详解!

供应链就是采购把东西买进来&#xff0c;生产去加工增值&#xff0c;物流去配送给客户&#xff0c;环环相扣&#xff0c;就形成了供应链。它是将供应商&#xff0c;制造商&#xff0c;分销商直到最终用户连成一个整体的功能网链结构。 而供应链管理就是做好每个环节的管理&…