设计模式笔记:简单工厂模式(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)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...
随机推荐
- springboot RestTemplate请求
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 1.定义 RestTemplateConfig 配置类 @Configuratio ...
- vue组件详解——使用slot分发内容
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 一.什么是slot 在使用组件时,我们常常要像这样组合它们: <app& ...
- P2256 一中校运会之百米跑(map+并查集)
思路:首先处理名字,让字符串直接映射唯一一个数字,这就用map<string, int>即可. 然后,直接用并查集 #include<iostream> #include< ...
- 爬取伯乐在线文章(四)将爬取结果保存到MySQL
Item Pipeline 当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item. 每个Item Pipeline ...
- AI R-CNN目标检测算法
Region-CNN,简称R-CNN,是首次将深度学习应用于目标检测的算法. bounding box IOU 非极大值抑制 selective search 参考链接: https://blog.c ...
- 工具 docker
环境配置 软件+环境 虚拟机 资源占用 容器 进程隔离 image(镜像)文件 容器文件 docker hub:仓库 docker container run image_name 挂载: 参考链接 ...
- python之type函数
python 的type 函数 的介绍的 下面就是此函数的参数 三个参数的意义 '''type(class_name, base_class_tuple, attribute_dict)cla ...
- F#.NET周报 2018第34周-Ionide下载量100万
回顾一下过去一周F#和.NET最新相关信息 原文 新闻 Ionide 你在VS Code 上写F# 是离不开他的. ^^ 下载100万了 .NET Core 2.1.3发布,支持LTS版本(L ...
- JavaEE学习之JAXB
一.前言 JAXB——Java Architecture for XML Binding,是一项可以根据XML Schema产生Java类的技术.JAXB提供将XML实例文档反向生成Java对象树的方 ...
- 如果IBM再给我一次实习机会
2014年,我拿到了IBM斯图加特R&D的实习机会.在连续被索尼和博世拒掉之后,这个实习对我来说弥足珍贵.我学的是通信专业,在这之前与编程相关的活动只有一学期的安卓Lab,还是靠抱队友大腿才及 ...