设计模式笔记:简单工厂模式(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无法形成基于继承的结构。
设计模式笔记:简单工厂模式(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)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...
随机推荐
- php 乱整
php获取两个数组相同的元素(交集)以及比较两个数组中不同的元素(差集) (一)php获取两个数组相同元素 array array_intersect(array $array1, array $ ...
- 17 python 初学(迭代器)
生成器都是迭代器,迭代器不一定是生成器 迭代器满足两个条件: 1. 有iter方法 2. 有next方法 # list, tuple, dict, string: iterable(他们都有iter方 ...
- Linux Driver 开发 eclipse工程找不到头文件
如下添加头文件路径, 右键单击工程,选择 Properties > C/C++ Build > Settings > > GCC C/C++ Compiler ...
- springboot配置文件中使用当前配置的变量
在开发中,有时我们的application.properties某些值需要重复使用,比如配置redis和数据库或者mongodb连接地址,日志,文件上传地址等,且这些地址如果都是相同或者父路径是相同的 ...
- gogs仓库管理软件 exec: "git-upload-pack": executable file not found in $PATH
当配置完个人中心的ssh公钥的时候,在客户端拉取代码的时候,提示如下错误: Cloning into 'comix-b2m'... Gogs: Internal error fatal: Could ...
- 理解JSON Web Token (一)
一:理解单系统登录的原理及实现? web应用采用的 browser/server 架构的,http是无状态协议的,也就是说用户从A页面跳转到B页面会发起http请求,当服务器返回响应后,当用户A继续访 ...
- 在DevExpress程序中使用PopupContainerEdit和PopupContainer实现数据展示
在一些数据的即时查询场景中,我们可能需要对输入信息进行模糊查询并进行选择,例如在一些文本输入场景,如输入某个站点编码或者设备编码,然后获取符合的列表供用户选择的场景,本篇随笔介绍在DevExpress ...
- public private protected default小结
public:可以被所有其他类所访问: private:只能被自己访问和修改: protected:自身.子类及同一个包中类可以访问: default:声明时没有加修饰符,同一包中的类可以访问:当子类 ...
- Latex(表格|图片(一丢丢))
目录 普通的例子 Notation 例子 p{width} 列分割符 @{} \multicolumn supertabular | longtabular 浮动体 table 浮动体 图片 \use ...
- ES5中文分词(IK)
ElasticSearch5中文分词(IK) ElasticSearch安装 官网:https://www.elastic.co 1.ElasticSearch安装 1.1.下载安装公共密钥 rpm ...