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

简单工厂模式

简单工厂模式概念:

      简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

简单工厂类图:

 

简单工厂类(creater):是工厂模式的核心,负责创建所有类的内部逻辑。需供外界调用,所以一般为静态方法。返回抽象父类。

抽象产品(Product):是所有类抽象出来的父类。可以是接口,也可以是抽象类。

具体产品(Concrete Product):角色,简单工厂中的实例对象。工厂类中需返回的对象。

简单工厂模式深入分析

       简单工厂模式解决的问题是如何去实例化一个合适的对象。

       简单工厂模式的核心思想就是:有一个专门的类来负责创建实例的过程。

       具体来说,把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。而工厂类用来产生一个合适的对象来满足客户的要求。

       如果简单工厂模式所涉及到的具体产品之间没有共同的逻辑,那么我们就可以使用接口来扮演抽象产品的角色;如果具体产品之间有功能的逻辑或,我们就必须把这些共同的东西提取出来,放在一个抽象类中,然后让具体产品继承抽象类。为实现更好复用的目的,共同的东西总是应该抽象出来的。

 

简单工厂实例:

     用户给出一个文件名,需要根据文件名的后缀名判断它是什么文件,要用什么软件打开。

     比如如果用户给出的文件名是“我的资料.txt”,那么工厂类就需返回一个文本类对象,然后输出“我的资料.txt”是文本文件,后缀名是“.txt”,需要用记事本打开。

 根据需求 我们需要创建一个父类OpenFile.cs

 1 class OpenFile
 2 {
 3 private string cmd;
 4 public string Cmd{
 5 get{
 6  return cmd;
 7 } 
 8 }
 9 public OpenFile(string cmd){
10 this.cmd=cmd;
11 }
12 public virtual viod Open(){
13 Console.WirteLine("无法识别文件!");
14 }
15 }

添加两个文件类继承于类OpenFile:

Text.cs

class Text{
public Text(string cmd):base(cmd){}
public override void Open(){
string FileName = Path.GetFileNameWithoutExtension(Cmd);
string FileExtension = Path.GetExtension(Cmd);
Console.WirteLine("{0}是文本文件,后缀名是{1},需用记事本打开!");
}
}

Excel.cs

class Excel{
public Excel(string cmd):base(cmd){}
public override void Open(){
string FileName = Path.GetFileNameWithoutExtension(Cmd);
            string FileExtension = Path.GetExtension(Cmd);
Console.WriteLine("{0}是表格文件,后缀名是{1},需用Excel打开!");
}
}

然后创建工厂类来创建实例对象:

Factory.cs

class Factory{
public static OpenFile GetObj(string cmd){

            string FileExtension = Path.GetExtension(Cmd);
switch(FileExtension){
case ".txt": return new Text(cmd);
case ".xls": return ne Excel(cmd);
default : return new OpenFile(cmd);
}
}
}

main函数中代码:

Console.WriteLine("请输入你要打开的文件名。")
string cmd=Console.ReadLine(); 
OpenFile o= Factory.GetObj(cmd);
o.Open();
Console.ReadKey();

 

转载于:https://www.cnblogs.com/tanzhen/p/4221885.html

相关文章:

  • JVM
  • cpu主频信息
  • 详细解读Android中的搜索框(三)—— SearchView
  • 长城:场面很热闹情节很垃圾
  • API开发的版本控制技巧
  • Android 强烈推荐:程序员接私活那点事
  • ProgressDialog使用总结
  • Apache 配置文件解析及虚拟机配置示例
  • 实现TeX的算法:回首编程技术的过去三十年
  • NodeJS几个值得学习的开源框架
  • Zipkin-1.19.0学习系列6:applyInitializers(context);
  • 1078: 输入入门(3)
  • iptables 用法
  • SVN Cleanup failed to process the following paths错误的解决
  • LoadRunner监控Linux
  • Android Volley源码解析
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Git的一些常用操作
  • Invalidate和postInvalidate的区别
  • Js基础——数据类型之Null和Undefined
  • October CMS - 快速入门 9 Images And Galleries
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • REST架构的思考
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Windows Containers 大冒险: 容器网络
  • 如何学习JavaEE,项目又该如何做?
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 数组大概知多少
  • 微信小程序设置上一页数据
  • 消息队列系列二(IOT中消息队列的应用)
  • mysql面试题分组并合并列
  • Nginx实现动静分离
  • ​【已解决】npm install​卡主不动的情况
  • ​如何防止网络攻击?
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #{}和${}的区别是什么 -- java面试
  • #Z2294. 打印树的直径
  • (1)(1.13) SiK无线电高级配置(六)
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)大道至简,职场上做人做事做管理
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net对接阿里云CSB服务
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • [ JavaScript ] JSON方法
  • []我的函数库
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [AIGC] Kong:一个强大的 API 网关和服务平台
  • [BJDCTF2020]The mystery of ip
  • [BZOJ1053][HAOI2007]反素数ant
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh
  • [CQOI 2011]动态逆序对
  • [emuch.net]MatrixComputations(7-12)