首页 > 其他分享 >设计模式理解

设计模式理解

时间:2024-06-03 20:46:07浏览次数:23  
标签:Module 工厂 public 理解 interface new 设计模式 class

1. 简单工厂模式: 就是在一个单例里面 通过传入的值创建不同的对象

class ModuleFactory
    {
        public static Module CreateModuel(ModuleType type)
        {
            switch (type)
            {
                case ModuleType.A:
                    return new A();
                case ModuleType.B:
                    return new B();
                default:
                    throw new Exception("Wrong");
            }
        }
    }
    public enum ModuleType
    {
        A,B
    }
    public interface Module
    {

    }
    public class A:Module { }
    public class B : Module { }
View Code

优点:全局通过一个ModuleFactory.CreateModule 获取Module下所有的类型,我程序用于缓存机制 通过CacheFactory.Instance 获取 redis 或者本地缓存。

缺点:1.新增 一个 C类型,需要修改 ModuleFactory 里面的方法(可以用IOC缓解)

   2.Module如果新增一个新的方法,那么全局所有的子类都需要重写,所以我建议可以用抽象类型代替,或者集成一个父类,且父类通过 向后运行机制代替,而不用 interface

2. 工厂模式:通过interface来获取不同的子类工厂,让子类工厂各自创建需要的对象

public class FactoryConsole
    {
        Module module;
        public FactoryConsole()
        {
            ModuleFactory factory = new AModuleFactory();
            //factory = new BModuleFactory();
            module = factory.CreateModuel();
        }
        public void Console1()
        {
            module.ToString();
        }
        public void Console2()
        {
            module.ToString();
        }
        public void Console3()
        {
            module.ToString();
        }
    }
    public interface ModuleFactory
    {
        Module CreateModuel();
    }
    public class AModuleFactory : ModuleFactory
    {
        public Module CreateModuel()
        {
            return new A();
        }
    }
    public class BModuleFactory : ModuleFactory
    {
        public Module CreateModuel()
        {
            return new B();
        }
    }
View Code

优点:我只需要切换FactoryConsole里面初始化的值,到BModuleFactory,那么FactoryConsole底下全部的调用的地方都自动切换到了BModuleFactory,不需要一个个到固定的具体使用的方法里面,甚至我只需要将 AModuleFactory.CreateModuel 切换到B,那么全部使用CreateModuel的地方全部切换成了 BModule。

思考:

  • 如果是想全局通过工厂模式切换,可以直接使用简单工厂(不传参数,改变返回的默认值,即可全部切换)。所以工厂模式是为了针对一个项目不同返回不同对象来处理业务的场景,这点非常重要,区别于单例,ps虽然简单工厂基本上是单例
  • 如果90%是固定的实现对象,剩余10%是单独对象场景,注意固定实现对象的意思是,要切换都切换的场景,可以实现一个default工厂,此工厂为简单工厂来实现,然后与单独对象公用最外层工厂
  • IOC可以理解成是简单工厂+工厂模式+单例模式的组成形式

3.抽象工厂模式:我认为此翻译有误,Abstract Factory Pattern 应该为 工厂通过抽象的方法组合成新对象模式会更好点。

public interface AbstractFactory
    {
        Module Module();
        ModuleNew New();
    }
    public interface ModuleNew
    {

    }
    public class A1 : ModuleNew { }
    public class B1 : ModuleNew { }
View Code

多个父类在一个工厂里面组装成 需要的对方。

这也是 此设计模式根本使用场景,也是为什么称呼为创建型模式,其实也可以理解 拆解,

比如包子拆解成 面粉 水 馅 3个步骤,每个步骤都是一个工厂,如馅的工厂模式 用牛肉就是牛肉包子,用猪肉就是猪肉包子。

所以抽象工厂模式,就是好几个工厂在一个对象里面的组装。而不是 单独的一个设计模式

4.桥接模式:非常类似工厂模式,但是目的不一样,工厂返回的是所有内部实现的统一interface,目的只是为了与底层隔离,但是需要底层的功能,但是桥接模式 目的是 组装,创建新的功能,并且内部是 桥接多个不同的对象 组成新对象,这个也是桥接模式是结构型设计模式,而工厂是创建型设计模式,桥接模式自己不产生底层对象,只是为了交互,一定与工厂模式区分开来。桥接模式 只是为了粘合,功能使用,而工厂模式为了创建对象。典型区别,代码展示了工厂和桥接

interface BridgeModule
    {
        void Shape(ModuleA a, ModuleB b);
    }
    public class Bridge : BridgeModule
    {
        public void Shape(ModuleA a, ModuleB b)
        {
            throw new NotImplementedException();
        }
        public void InitShape()
        {
            ModuleFactory moduleFactoryA = new AbstractModuleFactory();
            Shape(moduleFactoryA.CreateAModuel(), moduleFactoryA.CreateBModuel());
        }
    }
    public interface ModuleFactory
    {
        ModuleA CreateAModuel();
        ModuleB CreateBModuel();
    }
    public class AbstractModuleFactory : ModuleFactory
    {
        public ModuleA CreateAModuel()
        {
            throw new NotImplementedException();
        }

        public ModuleB CreateBModuel()
        {
            throw new NotImplementedException();
        }
    }
    public interface ModuleA
    {

    }
    public class A : ModuleA { }
    public class B : ModuleA { }
    public interface ModuleB
    {

    }
    public class C : ModuleB { }
    public class D : ModuleB { }
View Code

 

标签:Module,工厂,public,理解,interface,new,设计模式,class
From: https://www.cnblogs.com/yichaohong/p/18222838

相关文章

  • 设计模式学习(二)工厂模式——工厂方法模式+注册表
    目录工厂方法模式的瑕疵注册表工厂方法模式的瑕疵在前一篇笔记中我们介绍了工厂方法模式,示例的类图如下:考虑一种情况:现在要在程序运行时,根据外部资源,动态的实例化对象。也就是说在编译期我们无法知道要实例化的对象的类型。因此在实例化的过程中,就需要加以判断。例如,在我的例......
  • ysyx:对数学表达式的理解
    数学表达式的递归分解顺序和日常的顺序是完全相反的。一方面,原本的高级运算符要后进行拆分,另一方面,原本的从左到右的运算顺序使得拆分运算符时要从最右侧进行拆分。要解析一个带有括号的长表达式并没有想象中那么容易我对括号处理的理解有问题,识别括号时,不是两侧有括号+括号匹配......
  • 帮助理解 JdbcTemplate 的使用
    什么是 JdbcTemplate?JdbcTemplate 是Spring框架中的一个类,用于简化与数据库的交互。它帮助我们处理很多繁琐的任务,例如打开和关闭数据库连接、处理SQL语句、处理异常等。使用 JdbcTemplate,你可以更轻松地执行数据库操作,比如查询、插入、更新和删除数据。1.配置 JdbcTe......
  • JavaEE初阶--锁进阶理解
    目录一、引言二、锁的分类1.乐观锁vs悲观锁2.重量级锁vs轻量级锁3.自旋锁vs挂起等待锁4.公平锁vs非公平锁5.可重入锁vs不可重入锁6.读写锁三、CAS1.什么是CAS?2.CAS伪代码3.CAS的实现4.CAS的应用5.CAS的ABA问题四、总结一、引言 前面的博客我们......
  • c/c++设计模式---享元模式
    引入享元模式:围棋游戏:namespace_nmsp1{enumEnumColor//棋子类型{Black,//黑White//白};structPosition//棋子位置{intm_x;intm_y;Position(inttmpx,inttmpy):m_x(tmpx),m_y(tmpy){}......
  • 一文带你理解透MyBatis源码
    本文分享自华为云社区《一文彻底吃透MyBatis源码!!》,作者:冰河。写在前面随着互联网的发展,越来越多的公司摒弃了Hibernate,而选择拥抱了MyBatis。而且,很多大厂在面试的时候喜欢问MyBatis底层的原理和源码实现。总之,MyBatis几乎成为了Java开发人员必须深入掌握的框架技术,今天,我们就......
  • 深入理解Linux文件系统
    目录inode和block概述block(块)indoe(索引节点)   inode的内容Linux系统文件三个主要的时间属性inode文件结构所以,当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找它对应的inode,看该用户是否具有访问这个文件的权限。如果有,就指向相对应的数据bloc......
  • 对补码的简单理解
    在学C时,对补码很困惑,通过学习,我的感悟是:溢出如果一个内存空间只能存放0~9中的一位数,那就会出现这样的现象:9+9=8,9+9+9=7,9+9+9+9=6,因为这些结果出现了进位,进位又被舍弃了,所以留在个位的数会减小。结果加9的操作得到的是减1的结果,因为加了一个9,舍弃了一个10,多舍弃的这个1,是来......
  • 深入理解Java Collections框架
    JavaCollections框架是Java标准库的重要组成部分,它提供了一套用于存储和操作数据的通用算法和数据结构。无论是处理简单的列表还是复杂的映射,JavaCollections框架都能帮助开发者高效地管理数据。本篇博客将详细介绍JavaCollections框架的基础知识、核心接口和类、常用集合以......
  • MD5加密算法中的加盐值(SALT)简单理解
    MD5是一种广泛使用的加密散列函数,它可以产生一个128位(16字节)的哈希值,通常用一个32位的十六进制字符串表示。MD5的主要目的是确保数据的完整性,而不是用于安全加密。加盐(Salting)是一种安全措施,用于增强密码存储的安全性。在密码学中,加盐值是一个随机生成的数据片段,它与密码结......