C#简单工厂模式和单列设计模式潜要解析
简单工厂设计模式,又叫做静态工厂方法(Static Factory Method)模式,就是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例。
简单工厂模式是工厂模式家族中最简单实用的模式。简单工厂设计模式是针对于创建类的对象的。
一般,简单工厂涉及到三个 角色/类:
一、工厂类:工厂类是简单工厂的核心,通过工厂类可以分别出的客户需求,在调用其子类。
二、抽象产品类:这个类是由工厂方法模式所创建的对象的父类,一般由接口和抽象类实现。
三、具体产品类:工厂方法模式所创建的任何对象都是这个角色的实例,由具体类实现。
下面我们用简单工厂设计一个订餐器:如图

首先,定义一个Pizza类,该类为抽象类,用于保存客户点击获取到的pizza类型,代码如下:
namespace Day08_0100.简单工厂
{
public abstract class Pizza
{
public abstract string Info();
}
}
其次,在定义两个string类,分别装pizza的种类,并用return返回值,代码如下:
namespace Day08_0100.简单工厂
{
public class PGPizza:Pizza
{
public override string Info()
{
return "提示代码1";
}
}
}
namespace Day08_0100.简单工厂
{
public class CheesePizza:Pizza
{
public override string Info()
{
return "提示代码2";
}
}
}
之后,是最为关键的,就是创建工厂类(PizzaFactory),该类包含一个静态的方法,该方法的返回值类型必须是抽象类;
工厂类根据传入的参数决定创建出哪一种产品类的实例。
示例代码:
namespace Day08_0100.简单工厂
{
public class PizzaFactory
{
public static Pizza getInstance(string type)
{
Pizza pizza=null;
switch (type)
{
case "提示代码1":
pizza = new PGPizza();
break;
case "提示代码2":
pizza = new CheesePizza();
break;
}
return pizza;
}
}
}
最后是在窗体中调用,在Button控件click事件下写如下代码:
private void btnOK_Click(object sender, EventArgs e)
{
//01.获取到用户选择的是哪种类型的Pizza
if (rboPG.Checked) //需要订购培根比萨
{
Pizza pizza= PizzaFactory.getInstance(rboPG.Text);
string word=pizza.Info();
MessageBox.Show(word);
//Animal animal=new Dog();
}
}
如此,用简单工厂订购pizza已经完成。
单列设计模式
单列模式:顾名思义就是一个对象只能初始化一次;
作用:减少开辟内存空间,节约内存开销
下面我来给大家说一个例子吧:
class Program
{ static void Main(string[] args)
{
A a1 = A();
A a2 = A();
Console.WriteLine(a1 == a2); //输出false
}
}
因为A对象在内存堆中开辟了a1和a2两个内存空间 所以他们的内存地址不可能相同。 那么,怎样才能开辟一个空间,而不是两个或者多个呢?那就需要使用到单列设计模式了
下面是A类的定义:
public class A
{
private static A a =null; //静态变量在类加载的时初始化,并且只初始化一次
//构造方法私有化在外不能new对象
private A()
{
}
public static A getsingleInstance()
{
if (a == null)
{
a = new A();
}
return a;
}
}
在运行下列代码:
class Program
{ static void Main(string[] args)
{
A a1 = A.getsingleInstance(); //同一个内存地址
A a2 = A.getsingleInstance();
A a3 = A.getsingleInstance();
Console.WriteLine(a1 == a2);//True
Console.WriteLine(a2 == a3);//True }
}
将构造方法设为私有方法,不能New。
C#简单工厂模式和单列设计模式潜要解析的更多相关文章
- 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目
小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...
- java 之 简单工厂模式(大话设计模式)
以前只是看设计模式,每次看完都去理解一次,并没有手动去写代码,所以理解的还不是很深刻,最近查看框架源码,发现很多地方用到的都是设计模式,因为对设计模式理解的不够深刻,所以源码查看进度很慢!现在决定来温 ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
- 设计模式在cocos2d-x中的使用--简单工厂模式(Simple Factory)
什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式.通过专门定义一个类来负责创建其它类的实例,被创建的实例 ...
- 设计模式之简单工厂模式Simple Factory(四创建型)
工厂模式简介. 工厂模式专门负责将大量有共同接口的类实例化 工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类. 工厂模式有三种形态: 1.简单工厂模式Simple Factory ...
- 学习设计模式第二十七 - GoF之外简单工厂模式
示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...
- C#设计模式系列:简单工厂模式(Simple Factory)
1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...
- Net设计模式实例之简单工厂模式(Simple Factory Pattern)
一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...
- 设计模式(二)简单工厂模式(Simple Factory Pattern)
一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工厂模式. 二.简单工厂 ...
随机推荐
- c#委托(Delegates)--基本概念及使用
在我这菜鸟理解上,委托就是可以用方法名调用另一方法的便捷方法,可以简化switch等语句的重复.最近做项目的时候恰好需要用到委托,便来复习及学习委托的使用.嗯...本人以前并没有用过,只是稍微知道而已 ...
- .NET Framework 2.0/3.0/3.5 以 v90 平台工具集为目标。请确保在计算机上安装了 Visual Studio 2008
今天在Visual Studio2010下面开发C++应用的时候发现“.NET Framework 2.0/3.0/3.5 以 v90 平台工具集为目标.请确保在计算机上安装了 Visual Stud ...
- 解决deepin没有ll等命令的办法
编辑~/.bashrc, 添加alias 如下 vim ~/.bashrc 设置别名. 添加如下行 alias ll='ls -alF' alias la='ls -A' alias vi='vim' ...
- 牛客练习赛47 A DongDong破密码 (异或性质,递推)
链接:https://ac.nowcoder.com/acm/contest/904/A 来源:牛客网 DongDong破密码 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1310 ...
- Codeforces 987 K预处理BFS 3n,7n+1随机结论题/不动点逆序对 X&Y=0连边DFS求连通块数目
A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_bac ...
- Vue基础第三章 - 计算属性
1.计算属性介绍 在第二章中我们介绍了在Vue的{{}}中可以使用一些简单的表达式进行计算,但是当表达式过长或者逻辑过于复杂就会变得不易理解和维护,比如第二章的示例{{ text.split(',') ...
- squid之------安装与基本配置
1.rpm安装squid yum -y install squid 2.squid主要组成部分 服务名:squid 主程序:/usr/sbin/squid 配置目录:/etc/squid 主配置文件: ...
- mybatis 的 DefaultVFS 日志乱码问题
mybatis 的 DefaultVFS 日志乱码问题 mybatis DefaultVFS 乱码 1. 问题描述 今天在启动同事搭建的工程时,发现 console 中乱码,细看下,是 mybat ...
- event对象中offsetX,clientX,pageX,screenX的区别
1.offsetXoffset意为偏移量,是事件对象距左上角为参考原点的距离.以元素盒子模型的内容区域的左上角为参考点.不包括border.2.clientX事件对象相对于浏览器窗口可视区域的X,Y坐 ...
- 对js数组去重的研究
1.利用es5 let arr = [1, 2, 3, 4, 5, 6, 7, 1, 2, 3] const unique=arr=>{ return Array.from(new Set(ar ...