设计模式(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设计模式学习记录-简单工厂模式、工厂方法模式
前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...
随机推荐
- IDEA创建普通java和web项目教程
1.第一个javaSE项目 01.双击idea运行IDE 02.配置JDK 03.创建项目的workspace .iml文件里面是当前项目的一些配置信息! 相当于web项目中的web.xml文件 04 ...
- 认识 tomcat 被占用问题
(1) Server 中的 port 该端口为tomcat使用jvm的端口,必须保证唯一性,否则tomcat启动不成功: (2) Connector 中的 port 该端口为tomcat中所有web应 ...
- S2:.net
1.net框架结构 主要包含公共语言运行时(CLR)和框架类库(.NET Framework 类库 ,FCL) 2.CLR 1.对于一个将要面向.NET平台进行开发的人来说,了解一下.NET平台的整 ...
- 基于Spring注解的上下文初始化过程源码解析(一)
最近工作之余有时间和精力,加上平时对源码比较感兴趣,就开始啃起了Spring源码.为加深印象写了这篇博客,如有错误,望各位大佬不吝指正. 我看的是Spring5的源码,从同性社区download下来后 ...
- Spring文档学习
Spring文档学习 参考Spring Framework Documentation学习 1. IoC 容器 1.1 容器实例化 <beans> <import resource= ...
- .Net Core in Docker - 使用阿里云Codepipeline及阿里云容器镜像服务实现持续集成(CI)
前面已经介绍过了 .Net Core 程序发布到 Docker 容器的内容.但是每次通过 SSH 链接到服务器敲命令,运行脚本也是挺麻烦的一件事.程序员是最懒的,能让电脑解决的问题绝不手动解决,如果当 ...
- The philosophy of ranking
In the book Decision Quality, one will be trained to have three decision making system; one of them ...
- Go中的并发编程和goroutine
并发编程对于任何语言来说都不是一件简单的事情.Go在设计之初主打高并发,为使用者提供了goroutine,使用的方式虽然简单,但是用好却不是那么容易,我们一起来学习Go中的并发编程. 1. 并行和并发 ...
- android——卡片式布局
一.CardView <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk ...
- 实现API优先设计的重要性和实现方式
应用API优先的方法意味着设计API时,使其具有一致性和适应性,无论应用于哪些开发项目.对API使用API描述语言(如OpenAPI)是关键,因为它有助于建立API与其他程序通信的枢纽,即使这些系 ...