C#设计模式系列:简单工厂模式(Simple Factory)
1. 简单工厂模式简介
1.1 定义
简单工厂模式:定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类。
简单工厂模式:只需要一个Factory类。
简单工厂模式:又称为静态工厂模式(Static Factory Pattern),Factory类为静态类或包含静态方法。
简单工厂模式:不属于23种GOF设计模式。
简单工厂模式:实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类实例。
1.2 使用频率
中
2. 简单工厂模式结构
2.1 结构图

2.2 参与者
简单工厂模式参与者:
◊ Product:抽象产品类,将具体产品类公共的代码进行抽象和提取后封装在一个抽象产品类中。
◊ ConcreteProduct:具体产品类,将需要创建的各种不同产品对象的相关代码封装到具体产品类中。
◊ Factory:工厂类,提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入参数的不同创建不同的具体产品对象。
◊ Client:客户端类,只需调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象。
3. 简单工厂模式结构实现
3.1 Product类抽象实现
Product.cs
using System;
using System.Collections.Generic;
using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Structural
{
public abstract class Product
{
}
}
ConcreteProduct.cs
using System;
using System.Collections.Generic;
using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Structural
{
public class ConcreteProduct : Product
{
}
}
Factory.cs
using System;
using System.Collections.Generic;
using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Structural
{
public class Factory
{
/// <summary>
/// 静态方法创建Product实例
/// </summary>
public static Product CreateProduct()
{
return new ConcreteProduct();
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Text; using DesignPatterns.SimpleFactoryPattern.Structural; namespace DesignPatterns.SimpleFactoryPattern
{
class Program
{
static void Main(string[] args)
{
Product product = Factory.CreateProduct();
Console.WriteLine("Created {0}", product.GetType().Name);
}
}
}
运行结果:
Created ConcreteProduct
请按任意键继续. . .
3.2 Product接口类实现
IProduct.cs
using System;
using System.Collections.Generic;
using System.Text; namespace DesignPatterns.SimpleFactoryPattern.StructuralInterfaceImplementation
{
public interface IProduct
{
void Display();
}
}
Product.cs
using System;
using System.Collections.Generic;
using System.Text; namespace DesignPatterns.SimpleFactoryPattern.StructuralInterfaceImplementation
{
public class Product : IProduct
{
public void Display()
{
Console.WriteLine("DesignPatterns.SimpleFactoryPattern.Structural.Product");
}
}
}
Factory.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using System.Reflection; namespace DesignPatterns.SimpleFactoryPattern.StructuralInterfaceImplementation
{
public class Factory
{
/// <summary>
/// Factory返回IProduct的静态方法
/// </summary>
/// <returns></returns>
public static IProduct Create()
{
// 使用new直接创建接口的具体类
//return new DesignPatterns.SimpleFactoryPattern.StructuralInterfaceImplementation.Product(); // 通过映射创建接口的具体类
return (IProduct)Assembly.Load("DesignPatterns.SimpleFactoryPattern").CreateInstance("DesignPatterns.SimpleFactoryPattern.StructuralInterfaceImplementation.Product");
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.SimpleFactoryPattern.StructuralInterfaceImplementation; namespace DesignPatterns.SimpleFactoryPattern
{
class Program
{
static void Main(string[] args)
{
IProduct product = Factory.Create();
product.Display();
}
}
}
4. 简单工厂模式实践应用
4.1 实践应用——运算操作
Operation.cs
using System;
using System.Collections.Generic;
using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical
{
/// <summary>
/// 运算类
/// </summary>
public abstract class Operation
{
public double NumberA { get; set; }
public double NumberB { get; set; } public virtual double GetResult()
{
const double result = ;
return result;
}
}
}
Plus.cs
using System;
using System.Collections.Generic;
using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical
{
/// <summary>
/// 加法运算
/// </summary>
public class Plus : Operation
{
public override double GetResult()
{
return NumberA + NumberB;
}
}
}
Minus.cs
using System;
using System.Collections.Generic;
using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical
{
/// <summary>
/// 减法运算
/// </summary>
public class Minus : Operation
{
public override double GetResult()
{
return NumberA - NumberB;
}
}
}
Multiply.cs
using System;
using System.Collections.Generic;
using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical
{
public class Multiply : Operation
{
public override double GetResult()
{
return NumberA * NumberB;
}
}
}
Divide.cs
using System;
using System.Collections.Generic;
using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical
{
public class Divide :Operation
{
public override double GetResult()
{
return NumberA / NumberB;
}
}
}
OperationFactory.cs
using System;
using System.Collections.Generic;
using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical
{
public class OperationFactory
{
public static Operation CreateOperate(string operate)
{
Operation operation = null; switch (operate)
{
case "+":
operation = new Plus();
break;
case "-":
operation = new Minus();
break;
case "*":
operation = new Multiply();
break;
case "/":
operation = new Divide();
break;
} return operation;
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Text; using DesignPatterns.SimpleFactoryPattern.Practical; namespace DesignPatterns.SimpleFactoryPattern
{
class Program
{
static void Main(string[] args)
{
Operation operateion = OperationFactory.CreateOperate("+");
operateion.NumberA = ;
operateion.NumberB = ; Console.WriteLine(operateion.GetResult());
}
}
}
4.2 实践应用——银行支付接口
IPayment.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical
{
public interface IPayment
{
bool Payfor(decimal money);
}
}
ABCPayment.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical
{
public class ABCPayment : IPayment
{
public bool Payfor(decimal money)
{
// 调用中国农业银行支付接口进行支付
return true;
}
}
}
ICBCPayment.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical
{
public class ICBCPayment : IPayment
{
public bool Payfor(decimal money)
{
// 调用中国工商银行支付接口进行支付
return true;
}
}
}
PaymentFactory.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical
{
public class PaymentFactory
{
public static IPayment CreatePayment(string bank)
{
IPayment payment = null;
switch (bank)
{
case "ABC":
payment = new ABCPayment();
break;
case "ICBC":
payment = new ICBCPayment();
break;
} return payment;
}
}
}
OrderService.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.SimpleFactoryPattern.Practical
{
public class OrderService
{
public bool CreateOrder(string bank)
{
decimal money=100m;
var payment = PaymentFactory.CreatePayment(bank); return payment.Payfor(money);
}
}
}
在OrderService类中,不依赖具体的支付类,只通过PaymentFactory来获取真正的支付类。
5. 简单工厂模式应用分析
5.1 简单工厂模式优点
◊ 实现创建和使用分离;
◊ Client无需知道所创建的ConcreteProduct类名,只需要知道ConcreteProduct所对应的参数。
5.2 简单工厂模式缺点
◊ Factory类集中所有ConcreteProduct的创建逻辑,职责过重。一旦需要添加新的ConcreteProduct,则需要修改Factory逻辑。这样违背了OCP(开放-关闭原则)。
◊ 由于使用了static方法,造成Factory无法形成基于继承的结构。
C#设计模式系列:简单工厂模式(Simple Factory)的更多相关文章
- 设计模式之简单工厂模式Simple Factory(四创建型)
工厂模式简介. 工厂模式专门负责将大量有共同接口的类实例化 工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类. 工厂模式有三种形态: 1.简单工厂模式Simple Factory ...
- 【设计模式】简单工厂模式 Simple Factory Pattern
简单工厂模式Simple Factory Pattern[Simple Factory Pattern]是设计模式里最简单的一个模式,又叫静态工厂模式[Static Factory Pattern], ...
- C#设计模式-1简单工厂模式Simple Factory)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 简单的工 ...
- 设计模式之简单工厂模式(Simple Factory Pattern)
一.简单工厂模式的由来 所有设计模式都是为解决某类问题而产生的,那么简单工厂模式是为解决什么问题呢?我们假设有以下业务场景: 在一个学生选课系统中,文科生用户选课时,我们要获得文科生的所有课程列表:理 ...
- 设计模式之—简单工厂模式<Simple Factory Pattern >
简单工厂模式结构图: 简单工厂模式以简单的加减乘除运算为例: 运算符类(Operation): namespace CalcTest.Simple_Factory_patterns { class O ...
- 【UE4 设计模式】简单工厂模式 Simple Factory Pattern
概述 描述 又称为静态工厂方法 一般使用静态方法,根据参数的不同创建不同类的实例 套路 创建抽象产品类 : 创建具体产品类,继承抽象产品类: 创建工厂类,通过静态方法根据传入不同参数从而创建不同具体产 ...
- Golang设计模式—简单工厂模式(Simple Factory Pattern)
Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...
- 创建型模式(前引)简单工厂模式Simple Factory
一引出的原因(解决下面的问题) 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式. 在简单工厂模式 ...
- 大白话简单工厂模式 (Simple Factory Pattern)
大白话简单工厂模式 (Simple Factory Pattern) 从买车经历说起 毕业两年,码农张小两口无法忍受挤公交,凌晨起床抢火车票的痛苦,遂计划买车.逛了多家4S店,最终定下日产某车型的轿车 ...
- Net设计模式实例之简单工厂模式(Simple Factory Pattern)
一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...
随机推荐
- css3之3D魔方动画(小白版)
在这里分享一下3D魔方动画,html5+CSS3即可完成~无图无真相,先上效果图 第一步非常简单,就是先将魔方的结构画出来.大家都玩过魔方,知道魔方是一个有六个面的正方体.这里我们先写一个大的di ...
- storm学习好文链接
大圆的那些事:http://www.cnblogs.com/panfeng412/tag/Storm/ xcc的博客:http://blog.csdn.net/damacheng/article/ca ...
- ejoy2d源码阅读笔记1
一直想学lua,学它如何与C结合来作逻辑,所以找了云风的一份代码来研究.这份代码是个框架库,叫ejoy2d,据云风的博客说,他们最新的手机游戏用的就是这套框架,所以实用性应该很强,虽然我不是学游戏的, ...
- jmobile学习之路 ----设备检测
用一个库,device.js.这是一种最简单的方法.device.js库,不依赖jQuery框架. <!doctype html> <html lang="en" ...
- jQuery 获取屏幕高度、宽度
做手机Web开发做浏览器兼容用到了,所以在网上找了些汇总下. alert($(window).height()); //浏览器当前窗口可视区域高度alert($(document).height()) ...
- Activemq mqtt 点对点聊天实现(转载)
我这想到一个点对点聊天的方法,不用没割人都建立一个topic了,思路还是自定义一个分发策略,具体如下: 1. 建立一个topic,所有人都用匹配订阅的方式订阅以该topic为头的topic,例如:所 ...
- 纯css来实现提示框
用js用多了,就疏忽了最基本的css了---用title属性来实现提示框.下面言归正传------如何用css实现提示框: 1.利用title属性来实现鼠标滑过某个元素时,实现提示整段内容的功能(利用 ...
- window.onload和$(document).ready(function(){})的区别
前段时间在面试之前查找并整理了一下window.onload和$(document).ready(function(){})区别,今天有时间更到我的博客上,由于本人资历尚浅,如有不对的地方,还请指正. ...
- NSCache和NSURLCache、网络缓存优化
本文目录 一种缓存优化方案 响应头'Last-Modified'和请求头'If-Modified-Since' 'Keep-Alive'响应头和不离线的URLSession 'Expires'响应头 ...
- PHP的数组排序函数
<?php class order{ /** * * 数组排序 * @param array $arr 例如: * array ( array ( 'deskId' => '460646' ...