工厂方法模式适合于对实现了同一接口或继承了同一父类的一些类进行实例的创建。一般是通过定义一个工厂类,并在其方法中实现对具有上述特点的类对象的创建。

根据具体产生类对象的方法定义形式,又可以将其分为普通工厂方法模式、多个工厂方法模式和静态工厂方法模式。

一、普通工厂方法模式:

常见的经典写法如下(以发送邮件和短信为例):

1.定义邮件类和短信类具有的共同接口:

1 interface Sender{
2
3     public void sender();
4
5 }

2.定义邮件类和短信类:

1 class MailSender implements Sender{
2
3     @Override
4     public void send() {
5         System.out.println("发送邮件");
6     }
7
8 }

1 class SmsSender implements Sender{
2
3     @Override
4     public void send() {
5         System.out.println("发送短信");
6     }
7
8 }

3.定义工厂类:

 1 class SenderFactory {
 2
 3     public Sender produce(String type) {
 4         if (type.equals("mail")) {
 5             return new MailSender();
 6         } else if (type.equals("sms")) {
 7             return new SmsSender();
 8         } else {
 9             return null;
10         }
11     }
12
13 }

4.测试生成MailSender和SmsSender对象:

 1 package com.qqyumidi;
 2
 3 public class FactoryMethodTest {
 4
 5     public static void main(String[] args) {
 6         SenderFactory factory = new SenderFactory();
 7         Sender mailSender = factory.produce("mail");
 8         Sender smsSender = factory.produce("sms");
 9     }
10
11 }

二、多个工厂方法模式:

将普通工厂模式中的工厂类中创建类的方法从依赖于参数判断改为直接针对每种对象各自定义一个生产方法。

具体代码如下:

 1 class SenderFactory {
 2
 3     public Sender produceMail(){
 4         return new MailSender();
 5     }
 6
 7     public Sender produceSms(){
 8         return new SmsSender();
 9     }
10
11 }

三、静态工厂方法模式:

静态工厂方法模式与前面两种具体的方法定义不同在于方法被定义成静态的,这样可以不通过创建工厂实例就能直接获取到目标类的对象。

 1 class SenderFactory {
 2
 3     public static Sender produceMail(){
 4         return new MailSender();
 5     }
 6
 7     public static Sender produceSms(){
 8         return new SmsSender();
 9     }
10
11 }

对于工厂方法模式,推荐使用第三种写法。

---------------------------------------------------------------------------------
笔者水平有限,若有错漏,欢迎指正,如果转载以及CV操作,请务必注明出处,谢谢!
分类: 设计模式
本文转自Windstep博客园博客,原文链接:http://www.cnblogs.com/lwbqqyumidi/p/3744842.html,如需转载请自行联系原作者

设计模式总结篇系列:工厂方法模式(Factory Method)相关推荐

  1. 【设计模式】工厂方法模式 Factory Method Pattern

    在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...

  2. 工厂方法模式(Factory Method)简介

    工厂方法模式 名字 跟已经介绍的 简单工厂模式很类似. 实际上它们的模型也是十分相似的. 我们先看看工厂模式的定义. 一. 工厂方法(Factory Method)模式定义 教材上是这样写的: 工厂方 ...

  3. 设计模式的征途—3.工厂方法(Factory Method)模式

    上一篇的简单工厂模式虽然简单,但是存在一个很严重的问题:当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背开闭原则.如何实现新增新产品而 ...

  4. 设计模式之六:工厂方法模式(Factory method Pattern)

    工厂方法(Factory Method)模式就是定义一个创建对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责具体产品的创建,仅提供了具体工厂子类必须实现的接口,这样核心类成为一个抽象 ...

  5. 设计模式之工厂方法模式(Factory Method Pattern)

    一.工厂方法模式的诞生 在读这篇文章之前,我先推荐大家读<设计模式之简单工厂模式(Simple Factory Pattern)>这篇文档.工厂方法模式是针对简单工厂模式中违反开闭原则的不 ...

  6. 设计模式之工厂方法模式(Factory Method)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  7. 设计模式之工厂方法模式---factory method

    模式的介绍 模式的定义 Define an interface for creating an object,but let subclassed decide which class to inst ...

  8. 软件工程 - 设计模式学习之工厂方法模式Factory Method

    在现实生活中我们可以看见,乐事在卖薯片,可比克也在卖. 我敢肯定的说它们各自都有自己的工厂来生产薯片,而且生产出来的薯片味道还是不一样的. 这就是我们这里所谓的工厂方法模式. 我们来看看这个模式的UM ...

  9. 设计模式题目-工厂方法模式(Factory Method)

    设计一个程序来读取多种不同存储格式的图片,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF格式图片读取器(GifReader)用于读取GIF格式的图片,JPEG格式图片读取器 ...

  10. C++实现工厂方法模式Factory Method Pattern

    设计原则6:要依赖抽象,不要依赖具体类.(又称依赖倒置原则Dependency Inversion Principle) 不能让高层组件依赖低层组件,而且,不管高层组件或低层组件,两者都应该依赖于抽象 ...

最新文章

  1. 论机器学习领域的内卷
  2. Maven之jar包和项目管理
  3. psycopg2 mysql_使用psycopg2操作PostgreSQL数据库之二
  4. 去除冗余token的DETR效果怎么样?NUS颜水成团队提出端到端的PnP-DETR结构
  5. wdcp安装mysql_安装wdCP,无法连接mysql,解决方法
  6. 2019最新Python爬虫高频率面试题总结(一)
  7. linux 文件颜色的含义
  8. js获取页面传来参数的方法
  9. Django - 模型序列化返回自然主键值
  10. python基础入门第0天
  11. Unity常用工具类
  12. 国产免费的visio替代品edraw mind map,用来话流程图够用了
  13. layui扩展第三方模块_Layui集成第三方插件nicescroll
  14. 【java学习之旅】——JSP入门
  15. Laravel 路由知识回顾记录 转自laravel 学院Laravel5.8
  16. 机器学习 第一节 第一课
  17. 进制的转换(计算方法)
  18. Discuz杂志/新闻报道模板(jeavi_line)UTF8-GBK/DZ模板下载
  19. 驱动仿真物品移动乌龟\Gazebo\cmd_vel和/gazebo/set_model_state
  20. GSM与GPRS区别介绍

热门文章

  1. 查找和排序的一点浅显认识
  2. node.js Promise简单介绍
  3. linux服务器无法识别xml文件,linux上重启服务器提示找不到smartbi-config.xml文件
  4. Linux 开发路线
  5. Dijkstra算法介绍+正确性证明+性能分析
  6. 线程池原理及创建并C++实现
  7. 前台进程组、后台进程组
  8. 移除html,jsp中的元素
  9. PhantomJS的使用
  10. eclipse警告与报错的修复