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)
一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工厂模式. 二.简单工厂 ...
随机推荐
- 2019-11-29-C#-在-8.0-对比-string-和-string_-的类型
title author date CreateTime categories C# 在 8.0 对比 string 和 string? 的类型 lindexi 2019-11-29 8:59:0 + ...
- window环境安装composer
今天在下载symfony2的框架的时候,发现要用到composer,因为之前笔者完全没有接触过composer,所以研究了很久之后,才终于安装完成 由于网上有各种资料介绍如何安装composer的,但 ...
- framebuffer测试程序
/* framebuffer简单测试程序 网上转载 很多次 的程序 :-) */ #include <stdio.h> #include <stdlib.h> #include ...
- 生成树计数及应用 Matrix-Tree
例:给定一个图,图上每条边是红色或蓝色 求恰好有K条红边的生成树的个数,N<=50. Matrix-Tree定理 对于限制条件可以利用多项式,把红边边权设为X,蓝边边权设为1. 最后求行列式得到 ...
- Spring MVC文件上传下载(转载)
原文地址: http://www.cnblogs.com/WJ-163/p/6269409.html 上传参考 http://www.cnblogs.com/lonecloud/p/5990060.h ...
- Spring + Mybatis 企业应用实战 第3章 Sping MVC的常用注解
注解(annotation) @Controller @Controller是扩展的@Component的,可以说基本一样,就是作为一种标志. @RequestMapping value: 指 ...
- angularjs 结构的两种写法(2)
app.js里面 route.js 本项目中的路由写法,路由的意思是:对应的跳转页面路径,比如此处当路由是member.user-statisttic时,是会跳转到url:http://.../use ...
- 【10】Python urllib、编码解码、requests、多线程、多进程、unittest初探、__file__、jsonpath
1 urllib urllib是一个标准模块,直接import就可以使用 1.1get请求 from urllib.request import urlopen url='http://www.nnz ...
- POJ-1904-King‘s Quest
链接: https://vjudge.net/problem/POJ-1904 题意: Once upon a time there lived a king and he had N sons. A ...
- mysql 8.0.16 单主 mgr搭建
mysql 8.0.16 单主 mgr搭建 环境介绍: 192.168.142.142 db142192.168.142.143 db143192.168.142.145 db145 1.安装依赖包 ...