推荐阅读:

      工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来。通俗来说,你只关心怎么用,不用关心怎么做。

工厂模式可以分为三类:

1.简单工厂模式(Simple Factory)

2.工厂方法模式(Factory Method)

3.抽象工厂模式(Abstract Factory)

      掌握简单工厂模式是我们学习工厂模式最基础的条件,只有理解了简单的,才能更深入的学习。对于刚接触设计模式的朋友来说,看前一篇单例模式的朋友觉得挺轻松,但今天要将的工厂模式可能就不是特别容易消化了。为了让大家更深刻的理解这个模式,我将给大家展现出一个有趣的学习过程。

简单工厂模式(Simple Factory Pattern)

简单工厂模式又称静态工厂方法模式(Static Factory Method)。

简单工厂模式要素:

①抽象基类:类中定义抽象一些方法,用以在子类中实现,通俗的说就是抽象产品。例:运算类my_opterator

②继承自抽象基类的子类:实现基类中的抽象方法,通俗的说就是具体的产品。例:加法类ADDopterator,乘法类MULopertator等

③工厂类:用以实例化对象。例如:factory

下面举个例子用类图来介绍一下上面几个要素之间的关系吧。

实现算术运算:



      命名空间简单工厂模式中包含抽象运算基类my_opterator、四个具体运算类、工厂类factory。本案例将向大家展示如何使用简单工厂模式来进行不同的算术运算。

代码实现过程:

1.创建抽象类my_opterator

abstract class my_opterator                 //算法类父类
{
private double m_a, m_b;
public double A //A属性
{
get { return m_a; }
set { m_a = value; }
}
public double B //B属性
{
get { return m_b; }
set { m_b = value; }
}
abstract public double getresult(); //抽象方法,获得结果
}

2.创建继承抽象类的子类。

class ADDopterator : my_opterator           //加法类
{
public override double getresult() //抽象方法的实现
{
return A + B;
}
} class SUBoperator : my_opterator //减法类
{
public override double getresult() //抽象方法的实现
{
return A - B;
}
} class MULopertator : my_opterator //乘法类
{
public override double getresult() //抽象方法的实现
{
return A * B;
}
} class DIVoperator : my_opterator //除法类
{
public override double getresult() //抽象方法的实现
{
return A / B;
}
}

3.创建一个工厂,生成基于给定信息的实体类的对象

class factory                                       //简单工厂类
{
private my_opterator m_opt;
public my_opterator createclass(string opt, double a, double b)
{
switch(opt)
{
case "+":
{
m_opt = new ADDopterator();
break;
}
case "-":
{
m_opt = new SUBoperator();
break;
}
case "*":
{
m_opt = new MULopertator();
break;
}
case "/":
{
m_opt = new DIVoperator();
break;
}
}
m_opt.A = a;
m_opt.B = b;
return m_opt;
}
}

4.使用该工厂,通过传递类型信息来获取实体类的对象。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace 简单工厂模式
{
class Program
{
static void Main(string[] args)
{
string A, B;
string opt;
Console.WriteLine("请输入数字A:");
A = Console.ReadLine();
Console.WriteLine("请输入运算符:");
opt = Console.ReadLine();
Console.WriteLine("请输入数字B:");
B = Console.ReadLine(); my_opterator my_opt; //算法类父类
factory fa = new factory(); //简单工厂类
my_opt = fa.createclass(opt, Convert.ToDouble(A), Convert.ToDouble(B)); //调用生产算法方法
Console.WriteLine(my_opt.getresult());
}
}
}

      从上面代码可以发现:系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂。

整合后的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace 简单工厂模式
{
class Program
{
static void Main(string[] args)
{
string A, B;
string opt;
Console.WriteLine("请输入数字A:");
A = Console.ReadLine();
Console.WriteLine("请输入运算符:");
opt = Console.ReadLine();
Console.WriteLine("请输入数字B:");
B = Console.ReadLine(); my_opterator my_opt; //算法类父类
factory fa = new factory(); //简单工厂类
my_opt = fa.createclass(opt, Convert.ToDouble(A), Convert.ToDouble(B)); //调用生产算法方法
Console.WriteLine(my_opt.getresult());
}
}
} class factory //简单工厂类
{
private my_opterator m_opt;
public my_opterator createclass(string opt, double a, double b)
{
switch(opt)
{
case "+":
{
m_opt = new ADDopterator();
break;
}
case "-":
{
m_opt = new SUBoperator();
break;
}
case "*":
{
m_opt = new MULopertator();
break;
}
case "/":
{
m_opt = new DIVoperator();
break;
}
}
m_opt.A = a;
m_opt.B = b;
return m_opt;
}
} abstract class my_opterator //算法类父类
{
private double m_a, m_b;
public double A //A属性
{
get { return m_a; }
set { m_a = value; }
}
public double B //B属性
{
get { return m_b; }
set { m_b = value; }
}
abstract public double getresult(); //抽象方法,获得结果
} class ADDopterator : my_opterator //加法类
{
public override double getresult() //抽象方法的实现
{
return A + B;
}
} class SUBoperator : my_opterator //减法类
{
public override double getresult() //抽象方法的实现
{
return A - B;
}
} class MULopertator : my_opterator //乘法类
{
public override double getresult() //抽象方法的实现
{
return A * B;
}
} class DIVoperator : my_opterator //除法类
{
public override double getresult() //抽象方法的实现
{
return A / B;
}
}

设计模式(C#)——02简单工厂模式的更多相关文章

  1. java设计模式-----1、简单工厂模式

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...

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

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

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

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

  4. Java设计模式2:简单工厂模式

    简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...

  5. 大话设计模式C++版——简单工厂模式

    简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...

  6. IOS设计模式浅析之简单工厂模式(SimpleFactory)

    概述 首先说明一下,简单工厂模式不属于23种GOF设计模式之一.它也称作静态工厂方法模式,是工厂方法模式的特殊实现.这里对简单工厂模式进行介绍,是为本系列后面的工厂方法和抽象工厂模式做一个引子. 定义 ...

  7. C#设计模式之二简单工厂模式(过渡模式)

    一.引言 之所以写这个系列,是了为了自己更好的理解设计模式,也为新手提供一些帮助,我都是用最简单的.最生活化的实例来说明.在上一篇文章中讲解了单例模式,今天就给大家讲一个比较简单的模式--简单工厂模式 ...

  8. 设计模式笔记:简单工厂模式(Simple Factory)

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

  9. Java设计模式学习记录-简单工厂模式、工厂方法模式

    前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...

随机推荐

  1. 知识图谱学习与实践(4)——通过例句介绍Sparql的使用

    通过例句介绍Sparql的使用 1 简介 SPARQL的定义,是一个递归的定义,为SPARQL Protocal and RDF Query Language,是W3C制定的RDF知识图谱标准查询语言 ...

  2. Linux系统安装Tomcat——.tar.gz版

    1.rpm.deb.tar.gz的区别: rpm格式的软件包适用于基于Red Hat发行版的系统,例如Red Hat Linux.SUSE.Fedora. deb格式的软件包则是适用于基于Debian ...

  3. 性能测试-loadrunner参数化

    工具:loadrunner11 ie8 场景:不同用户的登录 1.参数化功能: 让脚本使用批量的变化的数据测试,实现模拟不同数据/用户的行为 函数格式:返回值类型 函数名称(参数类型 参数,参数类型 ...

  4. linux初学者-磁盘加密篇

    linux初学者-磁盘加密篇 因为保密需要,一般系统中会在文件和磁盘中进行加密,但是文件的加密比较容易破解,不安全.所以在特殊需要下,会对磁盘进行加密,磁盘加密后在磁盘损坏的同时,其中的数据也会损坏, ...

  5. 上传及下载github项目

    1.上传本地项目 git init //把这个目录变成Git可以管理的仓库         git add README.md //文件添加到仓库         git add . //不但可以跟单 ...

  6. IO流总结2

    2.字节流 |-- InputStream(读) |-- OutputStream(写) 由于字节是二进制数据,所以字节流可以操作任何类型的数据,值得注意的是字符流使用的是字符数组char[]而字节流 ...

  7. HTTP_5_通信数据转发程序:代理、网关、隧道

    HTTP通信时,除客户端和服务器之外,还有一些用于通信数据转发的应用程序,例如代理,网关,隧道.配合服务器工作. 代理 转发功能,客户端与服务器之间可有多个代理, 缓存代理:减少服务器压力,透明代理: ...

  8. js实现字符串转JSON格式

    在浏览器前端实现字符串转JSON格式,有多种方法,总结如下: 方法1. js函数,eval() 语法: var obj = eval ("(" + txt + ")&qu ...

  9. 改MySQL的编码方式,解决jdbc MySQL中文乱码问题

    进MySQL安装目录,打开my.ini 这两个地方改成gbk 重启服务

  10. drf之序列化

    在django视图中使用serializer 只是使用serializer类编写API视图,没有用到REST框架 app01下的models.py from django.db import mode ...