Week 3

单例模式

在单例模式中,一个class只能生成 唯一的一个对象!!

public class SMemoryCache
{private static SMemoryCache cache;private Dictionary<string, string> datas;//key: uid   value : 12388// pwd    : 93898493//一定要初始化 dictionaryprivate SMemoryCache(){datas = new Dictionary<string, string>();}//存值public void SetValue(string key, string value){datas[key] = value;}//取值public string GetValue(string key){if (datas.ContainsKey(key)){return datas[key];}return "";}//构造单例public static SMemoryCache GetInstance(){if (cache == null){cache = new SMemoryCache();}return cache;}
}

注意:以上实现的并不支持多线程

  • 也可以在c#利用静态构造函数 实现单例
 private static SMemoryCache cache;private Dictionary<string, string> datas;
//key: uid   value : 12388
// pwd    : 93898493
static SMemoryCache()
{cache = new SMemoryCache();
}private SMemoryCache()
{datas = new Dictionary<string, string>();
}

调用方式:

//HomeController 下:
public ActionResult SetValue(string key,string value)
{var cache = SMemoryCache.GetInstance();cache.SetValue(key, value);return Content("true");
}public ActionResult GetValue(string key)
{var cache = SMemoryCache.GetInstance();string value = cache.GetValue(key);return Content(value);
}

tips:这里的GetInstance()永远只会返回同一个实例

简单工厂、工厂模式、抽象工厂

工厂模式主要是负责 对象的创建

这样的原因有很多,绝大多数原因就是对上层的使用者隔离对象创建的过程;或者是对象创建的过程复杂,使用者不容易掌握;或者是对象创建要满足某种条件**,这些条件是业务的需求也好,是系统约束也好,没有必要让上层使用者掌握**,增加别人开发的难度。


  • 简单工厂:通过TestBank.CreateBank生成不同的Bank
  • 缺点:开闭规则不符合 每次要修改if else
public class TestBank
{public static ISBank CreateBank(string bankName){if (bankName == "ncwu"){return new NcwuBank(1223);}else if (bankName == "abc"){return new ABCBank("ddfda");}return default;}
}/// <summary>
/// 1定义了 银行的抽象
/// </summary>
public abstract class ISBank
{private double maxAmount;private double balence;protected double MaxAmount { get => maxAmount; set => maxAmount = value; }protected double Balence { get => balence; set => balence = value; }//public double Balence { get => balence; }/// <summary>/// 方法  存钱/// </summary>/// <param name="amount"></param>public abstract void PayIn(double amount);
}/// <summary>
/// 1.1 实现 ncwu的银行
/// </summary>
public class NcwuBank : ISBank
{public NcwuBank(double maxAmount){this.MaxAmount = maxAmount;Console.WriteLine("create ncwu!");}public override void PayIn(double amount){Balence += amount;}
}/// <summary>
/// 实现了 abc的银行
/// </summary>
public class ABCBank : ISBank
{private string masterName;public ABCBank(string masterName){this.masterName = masterName;Console.WriteLine("create abc!");}public override void PayIn(double amount){Balence += amount * 2;}
}

调用:

var ncwuBank =  TestBank.CreateBank("ncwu");
var abcBank = TestBank.CreateBank("abc");
  • 变为工厂模式
/// <summary>
/// 2抽象 一个工厂 --》生产银行
/// </summary>
public interface IFactoryBank
{ISBank CreateBank();
}/// <summary>
/// 2.1ncwu 工厂 --》 ncwu的银行
/// </summary>
public class NcwuFacotry : IFactoryBank
{public ISBank CreateBank(){return new NcwuBank(398498);}
}/// <summary>
/// 2.2 abc的工厂 ---》 abc的银行
/// </summary>
public class AbcFactory : IFactoryBank
{public ISBank CreateBank(){return new ABCBank("Dave");}
}

调用:

IFactoryBank factoryBank = new NcwuFacotry();
var bank =  factoryBank.CreateBank();
  • 抽象工厂:让一个Factory不单纯能生产一个Product,还能生产其他的Product
  • 在抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的对象
class TFactory
{public abstract class Button{public abstract void Show();}public abstract class Checkbox{public abstract void Show();}public class WinBotton : Button{public override void Show(){Console.WriteLine("win btn click");}}public class WinCheckbox : Checkbox{public override void Show(){Console.WriteLine("win checkbox click");}}public class MacBotton : Button{public override void Show(){Console.WriteLine("Mac btn click");}}public class MacCheckbox : Checkbox{public override void Show(){Console.WriteLine("Mac checkbox click");}}public interface IGuiFactory{Button CreateBotton();Checkbox CreateCheckbox();}public class WinFactory : IGuiFactory{public Button CreateBotton(){return new WinBotton();}public Checkbox CreateCheckbox(){return new WinCheckbox();}}public class MacFactory : IGuiFactory{public Button CreateBotton(){return new MacBotton();}public Checkbox CreateCheckbox(){return new MacCheckbox();}}
}

调用:

IGuiFactory guiFactory = new WinFactory();
var button =  guiFactory.CreateBotton();
button.Show();
var checkedBox = guiFactory.CreateCheckbox();
checkedBox.Show();

补充泛型 Nullable(显式、隐式)

出现原因:数据库中值类型 与 C# 中值类型 的值的不一致
**一个空 ** 、 一个不空

class SNullable<T>
{private bool hasValue= false;private T value;public SNullable(){this.hasValue = false;}public SNullable(T value){this.hasValue = true;this.value = value;}public T Value{get{if (!hasValue){throw new InvalidOperationException("empty!");}return value;}}public bool HasValue{get{return hasValue;}}public override string ToString(){return Value.ToString();}/// <summary>/// 隐式转换  nullable = a;/// </summary>/// <param name="value"></param>public static implicit operator SNullable<T>(T value){return new SNullable<T>(value);}/// <summary>/// 显示转换   a = (T)nullable/// </summary>/// <param name="sNullable"></param>public static explicit operator T(SNullable<T> sNullable){return sNullable.Value;}}

调用:

  • 直接不赋值,给null,调用会return Exception

    SNullable<int> sNullable1 =  new SNullable<int>();
    Console.WriteLine(sNullable1.HasValue);
    _ = sNullable1.Value;
    
  • 显式、隐式 转换

    int a = 1;
    double c = a;SNullable<int> sNullable =a;
    int b;
    b = (int)sNullable;Console.WriteLine(sNullable.ToString());
    

c# 中 Nullabe的简写:

?运算符:
Int? a; == Nullable<int> a

https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/nullable.cs

C#基础[Week3]-20级前后端相关推荐

  1. python前后端交互_Django基础之简单的前后端交互

    Python Python开发 Python语言 Django基础之简单的前后端交互 学习Django有一段时间了,最近刚好写了一个小项目,用到了前后端交互,刚开始写前后端交互确实很让人头晕目眩呢,下 ...

  2. VUE基础学习笔记——04前后端交互

    一.URL 地址格式 1.传统形式的 URL 格式:schema://host:port/path?query#fragment (1) schema:协议(http.https.ftp等) (2) ...

  3. Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题...

    现互联网公司后端架构常用到Spring+SpringMVC+MyBatis,通过Maven来构建.通过学习,我已经掌握了基本的搭建过程,写下基础文章为而后的深入学习奠定基础. 首先说一下这篇文章的主要 ...

  4. Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出...

    一.Maven多模块项目的创建 我们需要建立一个多模块的maven项目,其目录结构为 其中student-api用于暴露接口:student-service用语处理业务逻辑及调用数据访问对象,返回相应 ...

  5. 前后端交互ajax和axios入门讲解,以及http与服务器基础

    ajax和http小白入门,客户端与服务器基础讲解,前后端交互(从入门到实践详细解析) 文章目录 ajax和http小白入门,客户端与服务器基础讲解,前后端交互(从入门到实践详细解析) 前言 一.Aj ...

  6. 若依前后端分离版获取部门表所有最子级部门并匹配部门名称生成excel

    场景 若依前后端分离版手把手教你本地搭建环境并运行项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662 在上面 ...

  7. SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建【后端篇】【快速生成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】

    前后端分离项目快速搭建[后端篇] 数据库准备 后端搭建 1.快速创建个SpringBoot项目 2.引入依赖 3.编写代码快速生成代码 4.运行代码生成器生成代码 5.编写application.pr ...

  8. Springboot Vue前后端分离实现基础的后台管理系统

    最近在利用空闲的时间学习springboot+Vue前后端分离相关知识,然后动手写了个后台管理系统,实现登录验证.学生模块.英雄联盟模块.数据可视化(暂未开发,准备使用echarts进行):这边先以英 ...

  9. 保姆级的一个基于spring boot开发的前后端分离商城教程

    前言 推荐一个基于spring boot开发前后端分离商城,有完整的代码笔记和视频教程,希望对正在找项目练手的同学有所帮助 本文资料文档领取(在文末) 一.项目背景 5中常见的电商模式 B2B .B2 ...

最新文章

  1. NYOJ(21),BFS,三个水杯
  2. 100以内素数之和python123_python质数,水仙花数,简单猜拳游戏等
  3. 是圆的问题呢(洛谷P1652题题解,Java语言描述)
  4. python爬虫基础扫盲之urllib.pase解析URL
  5. [poj 2796]单调栈
  6. 问题三十七:C++怎么解一元四次方程?(2)——怎么解一元三次方程
  7. 转)TNS协议--翻译自《The Oracle Hackers Handbook》
  8. 零基础逆向工程11_C语言05_结构体
  9. 仙岛求药 详解(C++)
  10. 互相引用 spring_Spring-bean的几种循环依赖方式
  11. Mushroom Classification(蘑菇分类数据集)
  12. 安装ecshop php,如何安装ECSHOP?
  13. python自然语言处理实战源代码下载_NLP学习:涂铭《Python自然语言处理实战核心技术与算法》PDF+源代码...
  14. 微信开发者工具配置服务器信息,微信开发者中心如何配置
  15. SaaSBase:什么是企业微信?
  16. 01 APP被苹果APPStore拒绝的各种原因
  17. OpenStack核心组件原理与应用之Keystone
  18. Python函数绘图
  19. NAXX Demo3_JSQ_01
  20. 静电计算机故障的原因,主板因静电造成的故障现象与解决方法 -电脑资料

热门文章

  1. Generic Netlink机制
  2. iOS从初级到精通就业 Objective-C-栾斌-专题视频课程
  3. 【运维知识进阶篇】手把手教你搭建OpenVPN(保姆级教程)
  4. java typeof_typeof和instanceof的区别
  5. 数据分析入门(一)数据加载及初步分析
  6. HTML标签快速查询
  7. 单源最短路径---Dijkstra算法
  8. 【手写数字识别】基于matlab GUI BP神经网络单个或连续手写数字识别系统【含Matlab源码 2296期】
  9. 新加坡数字银行牌照争夺战:蚂蚁、小米、腾讯、头条等21家,谁能取胜?
  10. 菜鸟总结之——数据完整性