工厂方法模式:

定义了一个创建对象的接口,但是这个类不实际生成对象的实例,而是由其子类来进行实例化.工厂方法模式让类的实例化推迟到子类.

结构图:

解决的问题:

在软件系统中,我们会遇到这样一个问题,我们通过某种渠道实现了某个操作后,由于需求变化,或者其他一些原因,导致这个操作需要通过另外的渠道实现,从而导致我们不得不修改这个实现方法.如何封装这样一个易变的地方.工厂方法模式不能解决修改的问题,因为需求带来的变化,导致我们可能会对代码进行改变,我们进行封装的目的是为了减少改变,即:原来修改10处,现在修改一处即可.

使用此模式的前提是:在使用这个类的一些范围内,所有的对象都能抽象出共同的方法。

举个例子:

显示生活中的运输石油.我们决定使用火车运输,于是我们建立一个类,实现了以火车运输石油的方法.并且在大量的城市里都采用这种方式来运输.有一天,需求变化了,用火车运输石油导致城市严重污染,并且安全性不高,要求采用管道运输.于是我们就需要修改最初始建立的一个类,建立一个方法:输油管道().并且修改大量引用到用火车运油的地方.

刚开始设计的类:

public class CarryOil { public string CarryByTrain() { return "Use Train"; } }
修改后:
public class CarryOil { public string CarryByTrain() { return "Use Train"; } public string CarryByPiping() { return "Use Piping"; } }

这样,如果下次要求空运,汽车运,那么该怎么处理呢?继续在CarryOil 里添加新的方法,以适应新需求的变化,这就违反了"开放封闭原则"(对扩展开放,对修改封闭),我们仔细观察这些方法,无论是采用火车、汽车、飞机、管道运输石油,都可以抽象出一个方法:运输石油。于是,我们的设计如下:

此时,如果我们在添加新的运输方式时,只需要继承CarryOil类,实现Carry方法即可.此时,我们也无需再去关心关心其他两种运输方式是如何实现的.符合了面向对象设计中的单一职责原则,同时也很好的应用了"开放封闭原则".客户端调用时,代码如下:

protected void Page_Load(object sender, EventArgs e) { CarryOil c = new CarryOilWithTrain(); Display(c); } void Display(CarryOil c) { Response.Write("方式:" + c.Carry() + "<hr/>"); }

到这里,似乎设计没有问题,如果采用管道运输的话,直接改为CarryOilWithPiping即可.但是如果是页面上多处调用了上面的代码,并且都需要修改为CarryOilWithPiping时该怎么办呢?

例如:

    protected void Page_Load(object sender, EventArgs e){CarryOil c1 = new CarryOilWithTrain();Display(c1);CarryOil c2 = new CarryOilWithTrain();Display(c2);CarryOil c3 = new CarryOilWithTrain();Display(c3);}void Display(CarryOil c){Response.Write("方式:" + c.Carry() + "<hr/>");}

此时,如果改为使用管道运输,则3个CarryOilWithTrain都要被修改才可以.于是工厂方法模式出现了:

代码:

public interface ITransport
{CarryOil GetTraffic();
}public class TransportWithTrain : ITransport
{public CarryOil GetTraffic(){return new CarryOilWithTrain();}
}public class TransportWithPiping : ITransport
{public CarryOil GetTraffic(){return new CarryOilWithPiping();}
}
此时,页面调用时,如下方式调用:
    protected void Page_Load(object sender, EventArgs e){ITransport factory = new TransportWithTrain();CarryOil c1 = factory.GetTraffic();Display(c1);CarryOil c2 = factory.GetTraffic();Display(c2);CarryOil c3 = factory.GetTraffic();Display(c3);}void Display(CarryOil c){Response.Write("方式:" + c.Carry() + "<hr/>");}
此时,如果需要修改为使用管道的话,只需要修改TransportWithTrain为TransportWithPiping即可,实现了一处修改,而不是像上面三处修改.
而且在页面调用时,也没有使用到具体的类(这里指具体的产品类).此时是一个页面,多处调用了TransportWithTrain这个类,若是多个页面调用了这个类,该如何处理呢?
此时可以将ITransport factory = new TransportWithTrain(); 放在一个类里,如下:
public class CreateFactory
{public CreateFactory(){////TODO: 在此处添加构造函数逻辑//}public ITransport CreateTransportFactory(){ITransport tran = new TransportWithTrain();return tran;}
}
页面调用时:
    protected void Page_Load(object sender, EventArgs e){CreateFactory cf = new CreateFactory();ITransport factory = cf.CreateTransportFactory();CarryOil c = factory.GetTraffic();Display(c);}void Display(CarryOil c){Response.Write("方式:" + c.Carry() + "<hr/>");}

多少个页面调用这样的语句都可以,如果需要修改,使用管道时,只需要将CreateFactory类中CreateTransportFactory中的TransportWithTrain换成TransportWithPiping即可.

转载于:https://www.cnblogs.com/oneword/archive/2009/04/28/1445470.html

设计模式--工厂方法模式相关推荐

  1. 4. 星际争霸之php设计模式--工厂方法模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  2. java 工厂方法_java设计模式-工厂方法模式

    1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的"创建与使用相分离" ...

  3. 设计模式 | 工厂方法模式及典型应用

    工厂方法模式 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化.工厂方法模式让一个类的实例化延迟到其子类. 工厂方法模式又简称为工厂 ...

  4. python工厂模式 django_python设计模式-工厂方法模式

    题目:假设你有一个 pizza 店,功能包括下订单.做 pizza,你的代码会如何写呢? def order_pizza(): pizza = Pizza() pizza.prepare() pizz ...

  5. 工厂方法模式_1天1个设计模式——工厂方法模式

    意图 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型. 问题 假设你正在开发一款物流管理应用.1.0版本只能支持处理卡车运输,因此大部分的代码都位 ...

  6. [设计模式] ------ 工厂方法模式

    工厂方法模式 手机厂造手机,肥皂厂造肥皂,药品厂造药品. 假设有一大类对象A1,A2,A3,A4-他们都有一个共同的父类A A1可以想成是手机,A2可以想成肥皂- (下面例子的A1Factory就是手 ...

  7. JAVA设计模式 - 工厂方法模式

    工厂方法模式(Factory Pattern) 是一种创建型设计模式 , 它是Java中最常用的设计模式之一 . 1 . 工厂方法模式的定义 定义一个创建对象的接口 , 让子类决定实例化哪一个类 . ...

  8. Java设计模式—工厂方法模式抽象工厂模式

    工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...

  9. C#设计模式--工厂方法模式

    0.C#设计模式-简单工厂模式 设计模式: 工厂方法模式(Factory Method Pattern) 介绍:简单工厂模式是要在工厂类中通过数据来做个决策,在工厂类中的多个类中实例化出来其中一个要用 ...

  10. 设计模式 - 工厂方法模式 - 基于 Java 实现

    常见和工厂有关的设计模式 和工厂相关的设计模式主要有三种,工厂方法模式,抽象工厂模式: 在前面的博客中介绍了简单工厂模式,本篇博客主要介绍的是工厂方法模式 什么是工厂方法模式 工厂方法模式是简单工厂的 ...

最新文章

  1. 50 jQuery拷贝对象与多库共存
  2. latex 表格中虚线_如何识别和修复表格识别中的虚线
  3. 比亚迪汉鸿蒙系统测评_国产强强联合,比亚迪与华为联手打造的“汉”定制款华为P40亮相...
  4. docker 仓库镜像 替换_自己动手创建 Docker 镜像并分享到镜像仓库,容器引擎的用途越来越广泛!...
  5. java 字符串转日历_将字符串转换为Java中的日历对象
  6. Python图片与其矩阵数据互相转换
  7. QSqlTableModel配合QTableView设置单元格对齐方式和前景色等
  8. 使用Spring Security安全控制
  9. 只需 1 分钟,这个网站用 AI 分离歌曲的人声、伴奏和乐器声
  10. maxwell_电机气隙磁密与用matlab进行fft谐波分析,基于Maxwell的电机气隙磁场谐波分析程序...
  11. wasatch排版教程_[2010年国内外最新最全最专业的设计软件下载.docx
  12. 【ARM编程】ARM介绍
  13. 使用HTML制作网页
  14. Raspberry Pi OS 2022年09月发布,安装及成功连接。
  15. 一起学JAVA线程-JAVA Thread的基础
  16. 一个树莓派集群 (VAX)
  17. 使用google.zxing制作条形码和二维码
  18. 证券运维外包第3个月工作总结
  19. 学习笔记:cnn 猫狗识别
  20. QStringList去除重复项

热门文章

  1. 记录Access数据库更新操作大坑一个
  2. javascript实例:路由的跳转
  3. iOS FFmpeg 优秀博客(资源)集锦
  4. CentOS 5.8/6.7若干优化
  5. Junit介绍与实现
  6. Mybatis中insert之后返回主键
  7. Azure database
  8. 【loj6307】「雅礼国庆 2017 Day1」Clique 贪心
  9. codevs 1388 砍树
  10. linux下查看分区信息和剩余空间大小