简单工厂设计模式,又叫做静态工厂方法(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#简单工厂模式和单列设计模式潜要解析的更多相关文章

  1. 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目

    小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...

  2. java 之 简单工厂模式(大话设计模式)

    以前只是看设计模式,每次看完都去理解一次,并没有手动去写代码,所以理解的还不是很深刻,最近查看框架源码,发现很多地方用到的都是设计模式,因为对设计模式理解的不够深刻,所以源码查看进度很慢!现在决定来温 ...

  3. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  4. 设计模式在cocos2d-x中的使用--简单工厂模式(Simple Factory)

    什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式.通过专门定义一个类来负责创建其它类的实例,被创建的实例 ...

  5. 设计模式之简单工厂模式Simple Factory(四创建型)

    工厂模式简介. 工厂模式专门负责将大量有共同接口的类实例化 工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类. 工厂模式有三种形态: 1.简单工厂模式Simple Factory ...

  6. 学习设计模式第二十七 - GoF之外简单工厂模式

    示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...

  7. C#设计模式系列:简单工厂模式(Simple Factory)

    1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...

  8. Net设计模式实例之简单工厂模式(Simple Factory Pattern)

    一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...

  9. 设计模式(二)简单工厂模式(Simple Factory Pattern)

    一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工厂模式. 二.简单工厂 ...

随机推荐

  1. 扫描全能王 v5.13.0.20190916 去水印和广告版

    说明 1.先安装1(安装完不要打开),再安装2,然后打开2,参考下图: 2.不要登录扫描全能王账号,否则会导致失败! 3.激活完成后可以卸载2 下载地址 城通网盘 蓝奏云(仅含1) 百度网盘 另外口袋 ...

  2. 一、模型验证CoreWebApi 管道方式(非过滤器处理)2(IApplicationBuilder扩展方法的另一种写法)

    一. 自定义中间件类的方式用一个单独类文件进行验证处理 Configure下添加配置 //app.AddAuthorize(); AddAuthorize因为参数(this IApplicationB ...

  3. 模拟赛小结:2014-2015 ACM-ICPC, NEERC, Southern Subregional Contest

    2014-2015 ACM-ICPC, NEERC, Southern Subregional Contest 2019年10月11日 15:30-20:30(Solved 6,Penalty 740 ...

  4. 轻松获取LAMP,LNMP环境编译参数配置

    轻松获取LAMP,LNMP环境编译参数配置 作者:Mr.Xiong /分类:系统管理  字号:L M S     大家是否遇到过去了新公司,公司内的LAMP,LNMP等所有的环境都是配置好的(已经在提 ...

  5. Python服务器开发三:Socket

    Python服务器开发三:Socket   socket是操作系统中I/O的延续,它可以使进程和机器之间的通信成为可能.socket可以看成一个标准的文件描述符.不同的是文件需要用open()函数打开 ...

  6. java——HttpClient 代理模式发送Http Https

    在setProxy()方法中设置代理IP后可以将url中的域名换成这个代理IP. http很简单,但是https这样会报错. 问题:如何使用代理发送https请求? 客户端发送https请求之前会先向 ...

  7. web开发常见的几大安全问题

    一.SQL注入 SQL注入是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击.SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求 ...

  8. Email 发送

    namespace 99999 { /// <summary> /// Common interfaces to connect mail server to process e-mail ...

  9. 记ubuntu sudo无法使用,su密码不对的解决办法

    前言 因为我有强制关机的习惯, 然后就杯具了.. ubuntu版本是 16.04 sudo没法使用, su密码不对, 顿时我就慌了 解决方案 1.1.开机点击ESC,进去GUN GRUB界面 1.2. ...

  10. CSS实现二维码扫描的效果

    扫描二维码的效果,我原以为不好写呢,后来想了想其实挺简单的,几行代码,走起 <div class="code-bg"> <div class="line ...