当前位置: 首页 > news >正文

.NET 设计模式—简单工厂(Simple Factory Pattern)

简介

简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过一个工厂类来创建对象,根据不同的参数或条件返回相应的对象实例。这种模式隐藏了对象的创建细节,客户端只需通过工厂类获取对象而不需要直接实例化对象。

优点

  • 只需要传入 正确的参数 , 就可以 获取需要的对象 , 无需知道创建细节 ;
  • 工厂类中有必要的 判断逻辑 , 可以决定 根据当前的参数 创建对应的产品实例 , 客户端可以免除直接创建产品对象的责任 ;
  • 通过该模式 , 实现了对 创建实例 和 使用实例 的 责任分割 ;
  • 提供专门的 工厂类 用于创建对象 , 客户端 无需知道所创建的产品类的类名 , 只需要知道对应产品类的参数即可创建对象实例 ;

缺点

  • 工厂类 职责 过重 , 如果要增加新的产品 , 需要 修改工厂类的判断逻辑 , 违背 " 开闭原则 " ;
  • 7 大设计原则 , 不能全部遵守 , 也不能不遵守 , 注意平衡 功能 和 系统复杂度 , 找到最合适的一个点 ;

应用场景

  • 创建对象少 : 工厂类 负责 创建的对象 比较少 ;

  • 不关心创建过程 : 客户端 只知道 传入 工厂类 的参数 , 对于 如何创建对象 不关心 ;

实现

  • 创建一个学生的接口类:IStudent
public interface IStudent
{public void Study();
}
  • 创建三个子类:SmallStudent、MiddleStudent、LargeStudent继承接口IStuent
public class SmallStudent : IStudent
{public void Study(){Console.WriteLine("小学生在学习");}
}public class MiddleStudent : IStudent
{public void Study(){Console.WriteLine("中学生在学习!");}
}public class LargeStudent : IStudent
{public void Study(){Console.WriteLine("大学生在学习");}
}
  • 创建单独的简单工厂类统一创建实例
public class SimpleFactory
{/// <summary>/// 简单工厂/// </summary>/// <param name="type"></param>/// <returns></returns>/// <exception cref="NotImplementedException"></exception>public static IStudent CreateInstance(StudentType type){IStudent student = null;switch (type){case StudentType.SmallStudent:student = new SmallStudent();break;case StudentType.MiddleStudent:student = new MiddleStudent();break;case StudentType.LargeStudent:student = new LargeStudent();break;default:throw new NotImplementedException();}return student;}
}public enum StudentType : int
{[Description("小学生")]SmallStudent = 0,[Description("中学生")]MiddleStudent = 1,[Description("大学生")]LargeStudent = 2,
}
  • 演示上层调用
{IStudent smallStudent = SimpleFactory.CreateInstance(StudentType.SmallStudent);IStudent middleStudent = SimpleFactory.CreateInstance(StudentType.MiddleStudent);IStudent largeStudent = SimpleFactory.CreateInstance(StudentType.LargeStudent);
}

相关文章:

  • 第四百四十一回
  • 中兴天机A31 A31PRO 5G zte A2122H te A2022H 解锁BootLoader root权限 教程magisk,原厂刷机包
  • 游戏APP如何提高广告变现收益的同时,保证用户留存率?
  • Apache DolphinScheduler 【安装部署】
  • 四级英语翻译练习4.4
  • 【简单讲解下Tauri】
  • Flask Python:数据库多条件查询,flask中模型关联
  • FLink学习(三)-DataStream
  • 零长数组,whatwhy
  • Java面试宝典
  • JS-11A/11时间继电器 板前接线 JOSEF约瑟
  • 详细介绍如何利用 A star(A*)算法解决8数码问题
  • 基于Java,SSM,html,Vue在线视频播放管理系统网站设计
  • Windows通过git配置github代码仓库全流程
  • Android compose 使用指纹验证
  • [deviceone开发]-do_Webview的基本示例
  • 78. Subsets
  • Android开源项目规范总结
  • AngularJS指令开发(1)——参数详解
  • canvas绘制圆角头像
  • Hibernate【inverse和cascade属性】知识要点
  • Java 内存分配及垃圾回收机制初探
  • JavaScript-Array类型
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java反射-动态类加载和重新加载
  • JS变量作用域
  • Js基础知识(一) - 变量
  • opencv python Meanshift 和 Camshift
  • Protobuf3语言指南
  • Python 基础起步 (十) 什么叫函数?
  • 蓝海存储开关机注意事项总结
  • 软件开发学习的5大技巧,你知道吗?
  • 数据仓库的几种建模方法
  • 微信小程序设置上一页数据
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 用mpvue开发微信小程序
  • ​Python 3 新特性:类型注解
  • #传输# #传输数据判断#
  • (2)STM32单片机上位机
  • (C语言)二分查找 超详细
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (七)Knockout 创建自定义绑定
  • (十六)一篇文章学会Java的常用API
  • (转)Sublime Text3配置Lua运行环境
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • . Flume面试题
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Core 中的路径问题
  • .net 流——流的类型体系简单介绍
  • .NET 设计一套高性能的弱事件机制
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)