设计模式之工厂方法模式VS简单工厂方法模式

时间:2022-09-02 14:08:44

名词解释:

简单工厂:这个实在是没什么解释的,就是一个工厂类,然后有一个方法,根据传递的参数可以通过switch(你也可以是if,或者是使用高端的反射 )来进行对象的创建。

工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

区别:简单工厂的优点是工厂类中包含了逻辑(即通过判断,实例化对应的类型),对于客户端来说去除了与具体产品的依赖。但是如果有了新功能则就需要修改这个判断的逻辑(也就是违背了开放-封闭原则),所以这个也是工厂方法出现的必要性。工厂方法呢每一个类都有自己的工厂,当然也有抽象的工厂基类,这样客户端想实例哪种类型,只需实例化其对应的工厂即可。

必要元素:

实体类的抽象类(也可以是接口)、抽象工厂类(可以是接口)、各种实体类(继承自抽象类或者实现自接口)、各种实体工厂(继承自抽象工厂类或者实现自接口)。

上例子:

实体抽象类以及各个实体类:

abstract class Operation
{
public double NumberA { get; set; }
public double NumberB { get; set; }
public abstract double GetResult();
} class OperationAdd:Operation
{
public override double GetResult()
{
return NumberA + NumberB;
}
} class OperationDiv:Operation
{
public override double GetResult()
{
if (NumberB == )
throw new Exception("除数不能为0");
return NumberA / NumberB;
}
} class OperationMul:Operation
{
public override double GetResult()
{
return NumberA * NumberB;
}
} class OperationSub:Operation
{
public override double GetResult()
{
return NumberA - NumberB;
}
}

抽象工厂类和各个实体工厂类:

 abstract class OperationFactory
{
public abstract Operation CreationOperation();
} class OperationAddFactory : OperationFactory
{
public override Operation CreationOperation()
{
return new OperationAdd();
}
} class OperationSubFactory : OperationFactory
{
public override Operation CreationOperation()
{
return new OperationSub();
}
} class OperationMulFactory : OperationFactory
{
public override Operation CreationOperation()
{
return new OperationMul();
}
} class OperationDivFactory:OperationFactory
{
public override Operation CreationOperation()
{
return new OperationDiv();
}
}

客户端使用:

       Operation operation = factory.CreationOperation();
operation.NumberA = ;
operation.NumberB = ;
double result = operation.GetResult();
Console.WriteLine(result); factory = new OperationSubFactory();
operation = factory.CreationOperation();
operation.NumberA = ;
operation.NumberB = ;
result = operation.GetResult();
Console.WriteLine(result);

这样,如果我们有新的类型出现,则增加实体类,并且增加实体类的工厂即可,在客户端就可以直接使用新的工厂创建新的类型了。

总结:

工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现实体的创建,选择判断的问题还是存在,也就是说工厂方法把简单工厂内部逻辑判断移到了客户端代码来实现,之前如果要增加类型,修改的是工厂类,现在直接修改客户端即可(当然如果增加了某一个类型,也是需要增加其相对应的工厂类)。

设计模式之工厂方法模式VS简单工厂方法模式的更多相关文章

  1. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  2. java之设计模式工厂三兄弟之简单工厂模式

    [学习难度:★★☆☆☆,使用频率:★★★☆☆] 工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式.本章将要学习的简单工厂模式是工厂方法模式的& ...

  3. 设计模式之策略模式&简单工厂模式

    学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解. ...

  4. 设计模式在cocos2d-x中的使用--简单工厂模式(Simple Factory)

    什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式.通过专门定义一个类来负责创建其它类的实例,被创建的实例 ...

  5. C++设计模式 ==> 策略模式与简单工厂模式结合

    简介 策略模式相较之于简单工厂模式适用于生产方法经常变化且方法较为繁多的情况,因为生产方法时常变化就会需要频繁修改工厂类,违背了开闭原则,这时就可以用策略选择类由客户端根据需求动态切换策略.且策略模式 ...

  6. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

    简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...

  7. Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...

  8. 【LabVIEW技巧】工厂模式_简单工厂

    前言 上一个文章介绍了如何学习LabVIEW OOP,简要的提及了一些OOP学习中注意的事项,许多文章的读者反映写的太范,后文会逐步缩小范围,讨论在LabVIEW中各个模式的应用. 工厂模式概述 工厂 ...

  9. factory工厂模式之简单工厂SimpleFactory

    简单工厂(Simple Factory) 又叫静态工厂,是工厂模式三中状态中结构最为简单的.1.主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例.2.或者针对每个产品, ...

  10. Java学习笔记——Java工厂模式之简单工厂

    package com.app; import java.util.Date; /* * 工厂模式:简单工厂.工厂方法.抽象工厂 * * */ public class Test0718_Factor ...

随机推荐

  1. Redis从基础命令到实战之散列类型(Hash)

    从上一篇的实例中可以看出,用字符串类型存储对象有一些不足,在存储/读取时需要进行序列化/反序列化,即时只想修改一项内容,如价格,也必须修改整个键值.不仅增大开发的复杂度,也增加了不必要的性能开销. 一 ...

  2. win8.1 vs2010 C++环境下 编译Android Adb.exe

    1 IntelliSense: cannot open source file "usb100.h"  adb 这是因为没有安装sdk造成的.win7下安装wdk,vs2010能够 ...

  3. 当前标识(NT AUTHORITY\NETWORK SERVICE)没有对“C:\WINDOWS\Microsoft.NET\Frame

    异常详细信息: System.Web.HttpException: 当前标识(NT AUTHORITY\NETWORK SERVICE)没有对“C:\WINDOWS\Microsoft.NET\Fra ...

  4. iOS log第三方库之间的对比

  5. zabbix_fetion_alter

  6. finally与return

    finally关键字:和try块使用,一般做资源释放操作,比如关闭流.关闭数据库连接,释放锁. return:用于返回值. finally块可保证一定执行,当逻辑处理有返回值时,会首先执行finall ...

  7. winform —— 界面

    winform 界面简单介绍 窗体事件:理解为委托变量,指向哪个函数,就执行哪个函数.窗体:显示窗体的过程是一个通过模板造对象的过程.先走构造函数,构造函数中的InitializeComponent( ...

  8. hdu3015 Disharmony Trees

    Problem Description One day Sophia finds a very big square. There are n trees in the square. They ar ...

  9. yum程序下载被占用

    Loaded plugins: fastestmirror, refresh-packagekit, security Existing lock /var/run/yum.pid: another ...

  10. 深入理解JVM(8)——类加载的时机

    一.类的生命周期 一个类从加载进内存到卸载出内存一共要经历7个阶段:加载—>验证—>准备-->解析—>初始化—>使用—>卸载. 类加载包括五部分:加载—>验证 ...