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)
一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工厂模式. 二.简单工厂 ...
随机推荐
- 集群中Session共享解决方案分析
一.为什么要Session共享 Session存储在服务器的内存中,比如Java中,Session存放在JVM的中,Session也可以持久化到file,MySQL,redis等,SessionID存 ...
- php引用 & 详解
在PHP 中引用的意思是:不同的名字访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容在内存中存放的地址 变量的引用 $a = 222; $b = &$a; ...
- Qt Creator 4.9 发布
Qt Creator 4.8中引入了语言服务器协议支持,允许Qt Creator通过利用此标准轻松支持更多编程语言,使IDE和其他编程工具可以轻松地获得通用编程语言支持的交换格式.使用Qt Creat ...
- 2019牛客暑期多校训练营(第一场) B Integration (数学)
链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...
- SQL代码
SELECT SCHEMA_NAME(SCHEMA_ID)AS ID,name as Table_name FROM sys.tables;--查询表视图 查询表视图
- AngularJs 简单实现全选,多选操作(转)
代码如下: HTML: <section> <pre>{{choseArr}}</pre> 全选: <input type="checkbox&qu ...
- 中文转换为ASCII码的方式
可以到jdk安装路径: 找到native2ascii.exe文件 双击运行,敲入中文即可获取对应的ASCII编码
- Spring 跨重定向请求传递数据
在处理完POST请求后, 通常来讲一个最佳实践就是执行一下重定向.除了其他的一些因素外,这样做能够防止用户点击浏览器的刷新按钮或后退箭头时,客户端重新执行危险的POST请求. 在控制器方法返回的视图名 ...
- 11.关于django的content_type表
****** Django的contenttype表中存放发的是app名称和模型的对应关系 contentType使用方式 - 导入模块 from django.contrib.contenttype ...
- JPA学习(六、JPA_JPQL)
框架学习之JPA(六) JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 ...