设计模式(C#)——02简单工厂模式
推荐阅读:
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来。通俗来说,你只关心怎么用,不用关心怎么做。
工厂模式可以分为三类:
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简单工厂模式的更多相关文章
- java设计模式-----1、简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...
- C#设计模式系列:简单工厂模式(Simple Factory)
1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...
- Net设计模式实例之简单工厂模式(Simple Factory Pattern)
一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...
- Java设计模式2:简单工厂模式
简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...
- 大话设计模式C++版——简单工厂模式
简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...
- IOS设计模式浅析之简单工厂模式(SimpleFactory)
概述 首先说明一下,简单工厂模式不属于23种GOF设计模式之一.它也称作静态工厂方法模式,是工厂方法模式的特殊实现.这里对简单工厂模式进行介绍,是为本系列后面的工厂方法和抽象工厂模式做一个引子. 定义 ...
- C#设计模式之二简单工厂模式(过渡模式)
一.引言 之所以写这个系列,是了为了自己更好的理解设计模式,也为新手提供一些帮助,我都是用最简单的.最生活化的实例来说明.在上一篇文章中讲解了单例模式,今天就给大家讲一个比较简单的模式--简单工厂模式 ...
- 设计模式笔记:简单工厂模式(Simple Factory)
1. 简单工厂模式简介 1.1 定义 简单工厂模式:定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式:只需要一个Factory类. 简单工厂模 ...
- Java设计模式学习记录-简单工厂模式、工厂方法模式
前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...
随机推荐
- Node + js实现大文件分片上传基本原理及实践(一)
_ 阅读目录 一:什么是分片上传? 二:理解Blob对象中的slice方法对文件进行分割及其他知识点 三. 使用 spark-md5 生成 md5文件 四. 使用koa+js实现大文件分片上传实践 回 ...
- javascript获取指定区间范围随机数
//获取指定区间范围随机数,包括lowerValue和upperValuefunction randomFrom(lowerValue,upperValue){ return Math.floo ...
- JSP+java上传图片到服务器,并将地址保存至MYSQL + JSP网页显示服务器的图片
这两天遇到个需求——用户头像修改功能. 查了好多资料,不是代码不全,就是某些高端框架,卡了好久,今已实现,分享给大家,如果有更好的方法,非常感谢可以在下方评论区写出 一.整体项目架构 二.web.xm ...
- Jquery第一次考核
1. 什么是JS JavaScript 缩写.一种计算机脚本语言 JavaScript是一种动态.弱类型.基于原型的语言,通过浏览器可以直接执行 2. JS三大组成部件 ECMAScript DOM ...
- Spark Streaming消费Kafka Direct保存offset到Redis,实现数据零丢失和exactly once
一.概述 上次写这篇文章文章的时候,Spark还是1.x,kafka还是0.8x版本,转眼间spark到了2.x,kafka也到了2.x,存储offset的方式也发生了改变,笔者根据上篇文章和网上文章 ...
- JDK的可视化工具系列 (四) JConsole、VisualVM
JConsole: Java监视与管理控制台 代码清单1: import java.util.*; public class JConsoleDemo { static class OOMObject ...
- ElasticSearch6.x版本聚合分析整理
ElasticSearch6.x版本聚合分析整理 ES将聚合分析主要分为如下4类 Bucket,分桶类型,类似SQL中的GROUP BY语法 Metric,指标分析类型,如计算最大值 , 最小值,平均 ...
- ipv6的连接
基础知识不说了,网上一大堆! 基本内容不说了,写字太累了! 只说三点细节,记住就行: 1.ff开头的是多播地址,只能用于udp多播 2.fe80开头的是本地link地址,不管ping也好,connec ...
- 利用MAVEN打包可运行jar包,包括依赖的第三方包
转载自:http://bglmmz.iteye.com/blog/2058914 背景: 另一篇文章说了如何利用IDEA来打包,现在来说说如何利用MAVEN打包 目标:应用本身打成一个jar包,依赖的 ...
- React之动画实现
React之动画实现 一,介绍与需求 1.1,介绍 1,Ant Motion Ant Motion能够快速在 React 框架中使用动画.在 React 框架下,只需要一段简单的代码就可以实现动画效果 ...