推荐阅读:

       在简单工厂模式中讲到简单工厂模式的缺点:难以扩展,一旦添加新运算就必须修改简单工厂方法。

      工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使其创建过程延迟到子类进行。把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口。

 工厂模式要素:

1、抽象工厂(Creator):是工厂方法模式的核心角色,任何在模式中创建的对象的工厂类必须实现这个接口;

2、具体工厂(Concrete Creator):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象;

3、抽象产品(Product):工厂方法模式所创建的对象的基类,也就是产品对象的共同父类或共同拥有的接口;

4、具体产品(Concrete Product):这个角色实现了抽象产品角色所定义的接口。

下面举个例子用类图来介绍一下上面几个要素之间的关系吧。

 

      命名空间工厂方法模式中包含抽象工厂Factory、具体工厂LeiFactory 、抽象产品Volunteer,具体产品Leifeng 。本案例将向大家展示如何使用简单工厂模式来进行不同的算术运算。

代码实现过程:

1.创建抽象类Volunteer

abstract class Volunteer
{
public abstract void sweep();//扫地
public abstract void cook();//煮饭
public abstract void wash();//洗衣服
}

2.创建具体产品Leifeng

class Leifeng : Volunteer
{
public override void sweep()
{
Console.WriteLine("雷锋扫地");
}
public override void cook()
{
Console.WriteLine("雷锋煮饭");
}
public override void wash()
{
Console.WriteLine("雷锋洗衣");
}
}

3.创建抽象工厂Factory

abstract class Factory
{
public abstract Volunteer getvol();
}

4.创建具体工厂LeiFactory

class LeiFactory : Factory
{
public override Volunteer getvol()
{
return (new Leifeng());
}
}

5.使用该工厂,通过传递类型信息来获取实体类的对象。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace 工厂方法模式
{
class Program
{
static void Main(string[] args)
{
Factory fact = new LeiFactory();
Volunteer lei = fact.getvol();
lei.cook();
lei.sweep();
lei.wash(); fact = new UniFactory();
lei = fact.getvol();
lei.cook();
lei.sweep();
lei.wash();
}
}
}

从上面代码可以发现:

优点:

1、一个调用者想创建一个对象,只要知道其名称就可以了。

2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。

3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

整合后的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace 工厂方法模式
{
class Program
{
//使用工厂方法
static void Main(string[] args)
{
fact = new UniFactory();
lei = fact.getvol();
lei.cook();
lei.sweep();
lei.wash();
}
}
}
//抽象产品基类
abstract class Volunteer
{
public abstract void sweep();
public abstract void cook();
public abstract void wash();
}
//具体产品子类
class Leifeng : Volunteer
{
public override void sweep()
{
Console.WriteLine("雷锋扫地");
}
public override void cook()
{
Console.WriteLine("雷锋煮饭");
}
public override void wash()
{
Console.WriteLine("雷锋洗衣");
}
}
//抽象工厂类
abstract class Factory
{
public abstract Volunteer getvol();
}
//具体工厂
class LeiFactory : Factory
{
public override Volunteer getvol()
{
return (new Leifeng());
}
}

      使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。

      例如,我们我们增加一个人物:“博主”,此时我们只需要定义一个具体工厂——“博主”和具体产品——“博主”子类就可以。而不用像简单工厂模式中那样去修改工厂类中的实现(具体指添加case语句)。具体代码为:

//具体工厂——博主
class BloggerFactory : Factory
{
public override Volunteer getvol()
{
return (new BloggerFactory ());
}
}
//具体产品——博主子类
class Blogger: Volunteer
{
public override void sweep()
{
Console.WriteLine("博主扫地");
}
public override void cook()
{
Console.WriteLine("博主煮饭");
}
public override void wash()
{
Console.WriteLine("博主洗衣");
}
}

好了,工厂模式介绍完了,博主也该去扫地,煮饭,洗衣了。

设计模式(C#)——02工厂模式的更多相关文章

  1. 【java设计模式】-02工厂模式

    工厂模式简述 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客 ...

  2. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  3. 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式

    桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...

  4. C#设计模式(2)-简单工厂模式

    引言 上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式: 简单工厂模式简介 什么是简单工厂模式? 定义一个工厂类,它可以根据参数的不 ...

  5. java设计模式---三种工厂模式

    工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...

  6. Java进阶篇设计模式之二 ----- 工厂模式

    前言 在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模 ...

  7. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  8. C#设计模式(2)——简单工厂模式(转)

    C#设计模式(2)——简单工厂模式   一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理 ...

  9. Java设计模式之二 ----- 工厂模式

    在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模式,又 ...

  10. Java 设计模式之抽象工厂模式(三)

    原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...

随机推荐

  1. 打包名命令:tar

    将多个文件或目录包成一个大文件的命令功能,我们称它是一种"打包命令". tar的参数非常多,这里只列出几个常用的参数,更多的参数你可以自行man tar查询. [root@www ...

  2. 跟着大彬读源码 - Redis 7 - 对象编码之简单动态字符串

    Redis 没有直接使用 C 语言传统的字符串表示(以空字符串结尾的字符数组),而是构建了一种名为简单动态字符串(simple dynamic string)的抽象类型,并将 SDS 用作 Redis ...

  3. IBM RAD中集成Websphere启动后无法debug解决办法

    问题描述: IBM Rational Application Developer for WebSphere软件在启动WebSphere的时候无法以debug模式启动,debug启动后显示为start ...

  4. TypeError: unbound method

    调用类报错,具体如下 TypeError: unbound method submit() must be called with jinjin instance as first argument ...

  5. 【iOS】this class is not key value coding-compliant for the key ...

    一般此问题 都是由 interface build 与代码中 IBOutlet 的连接所引起的. 可能是在代码中对 IBOutlet 的名称进行了修改,导致 interface build 中的连接实 ...

  6. 【iOS】代码片段库

    若在某个 Objective-C 的实现文件中输入 init,Xcode 会自动列出一系列备选项,如图所示: Xcode 自动加入的这段代码源自代码片段库(code snippet library), ...

  7. 浅析java中的语法糖

    概述 编译器是一种计算机程序, 它主要的目的是将便于人编写.阅读.维护的高级计算机语言所写的源代码程序, 翻译为计算机能解读.运行的低阶机器语言的程序, 即可执行文件.而 javac 就是java语言 ...

  8. bucket list 函数解析

    cls_bucket_list 函数 librados::IoCtx index_ctx; // key   - oid (for different shards if there is any) ...

  9. form提交的几种方式

    背景 一直使用postman作为restful接口的调试工具,但是针对post方法的几种类型,始终不明白其含义,今天彻底了解了下 form提交的来源 html页面上的form表单 <form a ...

  10. Docker 核心技术

    docker是什么?为什么会出现? 容器虚拟化技术:轻量级的虚拟机(但不是虚拟机) 开发:提交代码 ——> 运维:部署 在这中间,因为环境和配置,出现问题 ——> 把代码/配置/系统/数据 ...