一、工厂方法模式(Factory Method)

工厂方法模式有三种

1、普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:

举例如下:(我们举一个发送邮件和短信的例子)

首先,创建二者的共同接口:

  1. public interface Sender {
  2. public void Send();
  3. }

其次,创建实现类:

  1. public class MailSender implements Sender {
  2. @Override
  3. public void Send() {
  4. System.out.println("this is mailsender!");
  5. }
  6. }
  1. public class SmsSender implements Sender {
  2. @Override
  3. public void Send() {
  4. System.out.println("this is sms sender!");
  5. }
  6. }

最后,建工厂类:

  1. public class SendFactory {
  2. public Sender produce(String type) {
  3. if ("mail".equals(type)) {
  4. return new MailSender();
  5. } else if ("sms".equals(type)) {
  6. return new SmsSender();
  7. } else {
  8. System.out.println("请输入正确的类型!");
  9. return null;
  10. }
  11. }
  12. }

我们来测试下:

  1. public class FactoryTest {
  2. public static void main(String[] args) {
  3. SendFactory factory = new SendFactory();
  4. Sender sender = factory.produce("sms");
  5. sender.Send();
  6. }
  7. }

输出:this is sms sender!

2、多个工厂方法模式,是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。关系图:

将上面的代码做下修改,改动下SendFactory类就行,如下:

public class SendFactory {  
public Sender produceMail(){  

  1. return new MailSender();
  2. }
  3. public Sender produceSms(){
  4. return new SmsSender();
  5. }
  6. }

测试类如下:

  1. public class FactoryTest {
  2. public static void main(String[] args) {
  3. SendFactory factory = new SendFactory();
  4. Sender sender = factory.produceMail();
  5. sender.Send();
  6. }
  7. }

输出:this is mailsender!

2.2、静态工厂方法模式,将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

  1. public class SendFactory {
  2. public static Sender produceMail(){
  3. return new MailSender();
  4. }
  5. public static Sender produceSms(){
  6. return new SmsSender();
  7. }
  8. }
[java] view plaincopy
  1. public class FactoryTest {
  2. public static void main(String[] args) {
  3. Sender sender = SendFactory.produceMail();
  4. sender.Send();
  5. }
  6. }

输出:this is mailsender!

总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

3、抽象工厂模式(Abstract Factory)

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。因为抽象工厂不太好理解,我们先看看图,然后就和代码,就比较容易理解。

请看例子:

  1. public interface Sender {
  2. public void Send();
  3. }

两个实现类:

  1. public class MailSender implements Sender {
  2. @Override
  3. public void Send() {
  4. System.out.println("this is mailsender!");
  5. }
  6. }
  1. public class SmsSender implements Sender {
  2. @Override
  3. public void Send() {
  4. System.out.println("this is sms sender!");
  5. }
  6. }

两个工厂类:

  1. public class SendMailFactory implements Provider {
  2. @Override
  3. public Sender produce(){
  4. return new MailSender();
  5. }
  6. }
  1. public class SendSmsFactory implements Provider{
  2. @Override
  3. public Sender produce() {
  4. return new SmsSender();
  5. }
  6. }

在提供一个接口:

  1. public interface Provider {
  2. public Sender produce();
  3. }

测试类:

  1. public class Test {
  2. public static void main(String[] args) {
  3. Provider provider = new SendMailFactory();
  4. Sender sender = provider.produce();
  5. sender.Send();
  6. }
  7. }

其实这个模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就OK了,无需去改动现成的代码。这样做,拓展性较好!

以上内容引自于   https://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html

转载于:https://www.cnblogs.com/wuxinyiwu/p/8057645.html

Java二十三设计模式之------工厂方法模式相关推荐

  1. 一文叫你弄懂Java设计模式之工厂方法模式:图解+日志记录器代码实例

    文章目录 详解Java设计模式之工厂方法模式 案例引入工厂方法模式 工厂方法模式 定义 案例分析 UML类图分析 代码分析 工厂方法的重载 工厂方法的隐藏 模式优点 模式缺点 模式适用环境 详解Jav ...

  2. 设计模式之工厂方法模式、抽象工厂模式的概念和实现及使用“反射技术+读取配置文件”的方法对工厂模式进行改进(软件工程综合实践课程第三周个人作业)

    文章目录 一.实验目的 二.知识总结 1.工厂方法模式简介 2.抽象工厂模式简介 3.工厂模式小结 4.利用"反射技术+读取配置文件"的方法改进程序 三.实验内容 1. 工厂模式实 ...

  3. 设计模式:工厂方法模式(Factory method)

    设计模式:工厂方法模式(Factory method) 一.问题 在前一章中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨. ...

  4. C#设计模式(3)——工厂方法模式

    一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...

  5. 设计模式之工厂方法模式(创建型)

    一.模式定义 工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进行拓展,生产产品的过程由具体工厂类实现,基类只实现接口,这使得工厂方法模式可以在不修改 ...

  6. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  7. 设计模式复习-工厂方法模式

     设计模式复习-工厂方法模式 相对于简单工厂,工厂方法是把算法类的实例化延迟到了调用者那去做,调用者根据自己的需要,自己实例化相关的工厂并且生产相关算法.这么做是因为简单工厂是不满足OCP的,因为如果 ...

  8. 设计模式之工厂方法模式应用例题

    设计模式之工厂方法模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReade ...

  9. 【设计模式】工厂方法模式(C#)

    [设计模式]工厂方法模式 1.概述 针对简单工厂中的缺点,使用工厂方法模式就可以完美的解决,完全遵循开闭原则. 定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象.工厂方法使一个产品类的实例化 ...

最新文章

  1. R语言可视化分别使用lattice包和ggplot2包可视化热图(heatmap)并绘制热力图对应的系统树图(dendrogram)实战
  2. java中静态变量和静态方法分别有什么特点?
  3. jupyter notebook dead kernel问题解决
  4. 【Web安全】关于SQL Injection和盲注的探索(DVWA)
  5. MySQL索引(B+Tree 索引、哈希索引、全文索引、 空间数据索引)、索引优化、优点、使用场景
  6. memc_nginx+srcache_nginx+memcached构建透明的动态页面缓存
  7. 等待因该出现在while循环中,防止虚假唤醒
  8. python的函数_Python 返回函数+匿名函数
  9. 定量的方法如何能划分类别?
  10. CSS 12个趣味小技巧大公开 | 原力计划
  11. Python xrange()函数
  12. 通过日志对内存泄漏的检查
  13. EMQ X 工业物联网解决方案
  14. response.getStatusCode()==200什么意思
  15. 程序员如何跳出死循环,不作所谓的“程序猿”
  16. c++语言解一元二次方程,C++ 求解一元二次方程
  17. qt实现简易图片转换功能
  18. 想哭!我相信“官方”消息,炒币仍然被骗
  19. Android设置手机壁纸(WallPaper)
  20. Excel——数据有效性+条件格式应用

热门文章

  1. CentOS下安装Memcached,Linux下安装Memcached,centos下安装memcached,linux下安装memcached...
  2. 一点等于多少厘米_马桶知识介绍,你了解马桶多少
  3. IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO
  4. leetcode283. 移动零 比官方更好的解法。
  5. 多进程与多线程通信同步机制
  6. C++(STL):19---deque之删除和emplace用法
  7. Linux-2.6.25 TCPIP函数调用大致流程
  8. Linux(13)-文件权限,chmod
  9. 遵循五大设计理念 打造出色设计师
  10. 面试风云录(01) - 怎样回答这两个问题?