推荐阅读:

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

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

 工厂模式要素:

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("博主洗衣");
}
}

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

最新文章

  1. VC调试闪退解决办法
  2. IOS 学习 开发 自定义 UINavigationController 导航
  3. redis安装,配置
  4. WPF Datagrid multiple selecteditems in MVVM
  5. 【c++】读写txt
  6. Spring配置概述
  7. 多媒体应用-swift
  8. CFUUIDRef和CFStringRef-生成唯一标识符
  9. model、dao、 service 和Comtroll层的关系
  10. 不完善的css怦然心动,有待改进...
  11. SQL SERVER的单用户模式以及专用管理员连接
  12. 算法(第四版)C# 习题题解——1.4
  13. 使用Log4J收集日志
  14. docker mysql 主主同步
  15. python打印朱莉娅集合
  16. 图像小波变换去噪——MATLAB实现
  17. python argparse(参数解析模块)
  18. 简单介绍tomcat中maxThreads,acceptCount,connectionTimeout
  19. JS计算字符长度、字节数 -- 转
  20. java并发编程实战:第五章----基础构建模块

热门文章

  1. burpsuit用法
  2. 初始Spring 文档 完整版
  3. 【iOS】UITableViewDelegate 方法没有调用
  4. vue动态表单
  5. UE4中UMG与C++交互 页面文本修改
  6. 前端面试 js 你有多了解call,apply,bind?
  7. RocketMQ中Broker的启动源码分析(二)
  8. str_replace导致的注入问题汇总
  9. 通过Powershell修改文件默认打开方式
  10. dotnetcore 与 hbase 之一——hbase 环境准备