设计模式学习(四): 1.简单工厂 (附C#实现)
New


这是一个典型的情况, 我们需要在运行时来实例化一些具体的类. 在需要修改或者扩展的时候我们就需要改这段代码. 一个程序中可能会多次出现类似的代码, 这使得维护和更新非常困难而且容易出错.
通过面向接口的编程, 我们可以把自己从各种变化中隔离出来, 因为如果代码是面向接口的话, 那么通过多态机制, 任何实现了该接口的新类都可以直接被使用.
所以别忘了设计原则: 对修改关闭.
需求
假设你是个披萨店老板, 有以下代码:

这是订购披萨的过程.
而你可能需要多种披萨:

这里就是根据参数来创建不同类型的披萨实例. 然后再进行下一步操作.
但是这样的事情可能会发生: 添加新类型披萨, 淘汰某些类型的披萨.

对代码修修改改. 所以这不是对修改关闭. 上面那部分代码需要修修改改, 下面那部分代码是固定不变的. 那最好的办法就是封装它.
封装对象的创建
需要把变化的部分封装起来, 也就是把创建披萨那部分代码移动到另外一个对象里, 而这个对象将专注于创建披萨.
针对这种对象, 它有一个名字, 叫工厂(Factory). 工厂会处理对象创建的细节.
建立一个简单的披萨工厂

这个类只有一个任务: 为客户创建披萨.
为什么不适用静态(static)方法?
可以使用static方法, 这样的话你就不需要创建一个对象然后再调用方法了. 但是这么做也有一个缺点, 那就是不可以对它继承了, 也无法改变create方法的行为了.
使用SimpleFactory之后:

简单工厂 Simple Factory
简单工厂实际上并不是设计模式, 可以更多的认为是一种编程范式. 但是使用的却是非常广泛.
理清一下目前的情况:

C#实现:
namespace C04FactoryPattern.Bases
{
public interface IPizza
{
string Type { get; }
void Prepare();
void Bake();
void Cut();
void Box();
}
}
namespace C04FactoryPattern.Bases
{
public interface IPizzaStore
{
Pizza OrderPizza(string type);
}
}
namespace C04FactoryPattern.Bases
{
public abstract class Pizza: IPizza
{
public abstract string Type { get;}
public void Prepare()
{
Console.WriteLine($"{Type} is Preparing...");
}
public void Bake()
{
Console.WriteLine($"{Type} is Baking...");
}
public void Cut()
{
Console.WriteLine($"{Type} is Cutting...");
}
public void Box()
{
Console.WriteLine($"{Type} is Boxing...");
}
}
}
namespace C04FactoryPattern.Models
{
public class CheesePizza : Pizza
{
public override string Type => nameof(CheesePizza);
}
public class ClamPizza : Pizza
{
public override string Type => nameof(ClamPizza);
}
public class PepperoniPizza : Pizza
{
public override string Type => nameof(PepperoniPizza);
}
public class VeggiePizza : Pizza
{
public override string Type => nameof(VeggiePizza);
}
}
namespace C04FactoryPattern.SimpleFactory
{
public class SimplePizzaFactory
{
public Pizza CreatePizza(string type)
{
Pizza pizza = null;
switch (type)
{
case nameof(CheesePizza):
pizza = new CheesePizza();
break;
case nameof(ClamPizza):
pizza = new ClamPizza();
break;
case nameof(PepperoniPizza):
pizza = new PepperoniPizza();
break;
case nameof(VeggiePizza):
pizza = new VeggiePizza();
break;
}
return pizza;
}
}
}
namespace C04FactoryPattern.SimpleFactory
{
public class PizzaStore: IPizzaStore
{
private readonly SimplePizzaFactory _factory;
public PizzaStore(SimplePizzaFactory factory)
{
_factory = factory;
}
public Pizza OrderPizza(string type)
{
var pizza = _factory.CreatePizza(type);
if (pizza != null)
{
pizza.Prepare();
pizza.Bake();
pizza.Cut();
pizza.Box();
Console.WriteLine($"{type} Done!!!");
}
else
{
Console.WriteLine("We don't have this kind of pizza!!");
}
return pizza;
}
}
}
测试:
namespace C04FactoryPattern
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Simple Factory:");
PizzaStore pizzaStore = new PizzaStore(new SimplePizzaFactory());
pizzaStore.OrderPizza(nameof(CheesePizza));
pizzaStore.OrderPizza(nameof(PepperoniPizza));
Console.ReadLine();
}
}
}

设计模式学习(四): 1.简单工厂 (附C#实现)的更多相关文章
- Java设计模式学习笔记(二) 简单工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...
- C#设计模式学习笔记:简单工厂模式(工厂方法模式前奏篇)
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7551373.html,记录一下学习过程以备后续查用. 一.引言 简单工厂模式并不属于GoF23里面的设计模式 ...
- C#设计模式学习笔记:(2)工厂方法模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7567880.html,记录一下学习过程以备后续查用. 一.引言 接上一篇C#设计模式学习笔记:简单工厂模式( ...
- 设计模式(二)简单工厂模式(Simple Factory Pattern)
一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工厂模式. 二.简单工厂 ...
- 设计模式的征途—2.简单工厂(Simple Factory)模式
工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
- <一>读<<大话设计模式>>之简单工厂模式
工厂模式尽管简单.可是写下这篇文章却不简单. 第一:本人经过内心的挣扎后才决定開始写博文的.为什么呢,由于好长时间没有写了,对自己的文学功底也是好不自信.可是技术这东西你不写出来你真不知道自己掌握多少 ...
- PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)
最近天气变化无常,身为程序猿的寡人!~终究难耐天气的挑战,病倒了,果然,程序猿还需多保养自己的身体,有句话这么说:一生只有两件事能报复你:不够努力的辜负和过度消耗身体的后患.话不多说,开始吧. 一.什 ...
- 设计模式(四)抽象工厂模式(Abstract Factory Pattern)
一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码,而工厂方法模式每个具体工厂类只完成单个实例的创建 ...
随机推荐
- Java---实现邮件发送
实现发送邮件的发送必须有前提条件: 在qq邮件中开启POP3/SMTP服务,如下图所示(为本人邮件设置): 开启后会得到一个授权码.代码中会用到 需要的包: 百度网盘(包+源码):链接: https: ...
- UICollectionView具体解释
初始化部分: UICollectionViewFlowLayout *flowLayout= [[UICollectionViewFlowLayout alloc]init]; self.myColl ...
- java使用线程请求訪问每次间隔10分钟连续5次,之后停止请求
java使用线程请求訪问每次间隔10分钟连续5次,收到对应的时候停止请求 package com.qlwb.business.util; /** * * * @类编号: * @类名称:RequestT ...
- MongoDB学习笔记<一>
今天学习了shell的主要的操作,例如以下: 1.创建一个数据库foobar use foobar 2.给指定的数据库加入集合,并加入记录 db.person.insert({"name&q ...
- SharePoint 2013 引发类型为“System.ArgumentException”的异常。 參数名: encodedValue
SharePoint 2013 引发类型为"System.ArgumentException"的异常. 參数名: encodedValue 具体错误信息 说明: 运行当前 Web ...
- hdu5353 Average
Problem Description There are n soda sitting around a round table. soda are numbered from 1 to n and ...
- DDD理论学习系列——案例及目录
目录 DDD理论学习系列(1)-- 通用语言 DDD理论学习系列(2)-- 领域 DDD理论学习系列(3)-- 限界上下文 DDD理论学习系列(4)-- 领域模型 DDD理论学习系列(5)-- 统一建 ...
- 转:java泛型
1.为什么需要泛型 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52230032 泛型在Java中有很重要的地位,网上很多文章罗列各 ...
- 翻译:MariaDB DATABASE()
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- java中md5加密方法
package com.func; import java.io.UnsupportedEncodingException;import java.math.BigInteger;import jav ...