java设计模式之工厂方法详解
作者:bateman6988 发布时间:2023-09-09 01:18:56
一、概念
工厂方法模式是类的创建模式,又叫虚拟构造子模式(virtual constructor) 或者多态性工厂模式。
二、模式动机
定义一个抽像的工厂,将产品的具体创建工作推迟到抽像工厂的具体子类中,有些产品的创建非常复杂,试想如果将所有具体产品的创建工作都像简单工厂一样放到一个静态工厂方法中,那么这个工厂方法将无比巨大,且当需要扩展增加新的产品时,就必须修改原先的工厂方法,违背了开-闭原则,而工厂方法模式,对于每个具体产品的创建都有一个具体的工厂来创建,如果新增产品,只需要新增一个实现抽像工厂(或工厂接口)的具体工厂即可,也符合了开-闭原则。
三、模式的结构
从上图中我们可以看出,工厂方法涉及到4个角色
1.抽像工厂角色:该角色是工厂方法模式的核心,与应用程序无关,任何在模式中创建对像的工厂都必须实现这个接口,该角色往往是一个抽像的JAVA类或者接口。
2.具体工厂角色:该角色实现了抽像工厂,创建具体的产品,通常由一个具体的JAVA类来实现。
3.抽像产品角色:工厂方法模式所创建的产品的超类型,通常是一个JAVA抽像类或者JAVA接口。
4.具体产品角色:该角色实现了抽像产品接口,工厂方法所创建的每个对像都是这个角色的实例。
样例代码如下:
public abstract class Product
{
/**
* @roseuid 59AA7B2D03E7
*/
public Product()
{
}
}
public class ConcreteProduct1 extends Product
{
/**
* @roseuid 59AA7B2D037A
*/
public ConcreteProduct1()
{
}
}
public class ConcreteProduct2 extends Product
{
/**
* @roseuid 59AA7B2D03A1
*/
public ConcreteProduct2()
{
}
}
public abstract class Creator
{
/**
* @roseuid 59AA7B1600C6
*/
public Creator()
{
}
/**
* @return Product
* @roseuid 59AA77070055
*/
public abstract Product factoryMethod();
}
public class ConcreteCreator1 extends Creator
{
/**
* @roseuid 59AA7B2D031A
*/
public ConcreteCreator1()
{
}
/**
* @return Product
* @roseuid 59AA7707007B
*/
public Product factoryMethod()
{
return new ConcreteProduct1();
}
}
public class ConcreteCreator2 extends Creator
{
/**
* @roseuid 59AA7B2D034C
*/
public ConcreteCreator2()
{
}
/**
* @return Product
* @roseuid 59AA7707009B
*/
public Product factoryMethod()
{
return new ConcreteProduct2();
}
}
public class Client
{
private Creator theCreator;
/**
* @roseuid 59AA7AFC02D7
*/
public Client()
{
theCreator=new ConcreteCreator();
Product product=thCreator.factoryMathod();
}
}
四。模式样例
如现在有一个生产轮胎的工厂,该工厂可以生产benz车用的轮胎,还可以生产 bmw车子用的轮胎,后续还有可能生产audi车用的轮胎等等。由于 benz车用的轮态和bmw车子用的轮轮胎可能有比较大的差别,所用的材料和模具都会有所不同,工艺要求也不同,可以说要用不同的产品线(相当于一个子工厂)来生产(实例化),我们就可以用工厂的方法来
描述轮胎的产生过程,每个轮胎都颜色,都有寿命和胎面宽度等指标,于是我们可以抽像出一个轮胎的接口,所有的轮胎都应该是实现这个接口的类的实例,如下图所示:
当我们又增加了一条生产Audi车轮胎的产品线时,工厂方法能很好的适应,如上图我们只需增加一个AudiTire的具体产品类,然后再增加一个实例化该产品类的AudiTireFactory工厂就可以了,其它的工厂及产品类不需要做任何的修改,从此可以看出工厂方法模式对于同一产品等级下增加新的产品时是支持开闭原则的。
五、模式的约束
该模式只针对一个产品等级结构下的产品进行有效扩展,如上例,如果我们要增一个发动机的产品,工厂类就无法适应了。
六、模式的变体与扩展
如一个轮胎厂,他是benz旗下的子公司,他只生产benz车所使用的轮胎,那么这时抽像工厂类就没有必要了,只需要一个具体工厂就可以了,这时工厂方法模式的多态性工厂功能就退化了,如下图:
往往工厂只需要一个实例就可以了,所以上图工厂类的factoryMethod()就可以直接改为静态的方法,这样就直接退化为了简单工厂模式。
该工厂只生产benz车轮胎,那么轮胎的抽像接口其实也没有必要了,可以进一步退化如下图:
七、与其它模式的关系
暂略
八、模式优缺点
工厂方法模式,在同一个产品等级结构下,可以有效的支持开闭原则,但是不适用于增加新的产品等级结构
来源:http://www.cnblogs.com/bateman6988/p/7465733.html


猜你喜欢
- 废话不多说,我们先来认识一下这个GDI+,看看它到底长什么样。GDI+:Graphics Device Interface Plus也就是图
- 概述Spring Boot简化了Spring应用的开发过程,遵循约定优先配置的原则提供了各类开箱即用(out-of-the-box)的框架配
- 需求说明在对图像进行处理时,经常会有这类需求:想通过阈值对图像进行二值化分割,以提取自己感兴趣的区域,常见的阈值分割方法有常数分割、最大类间
- 什么是Kotlin?Kotlin是一种可以在 Java 虚拟机 (JVM) 上运行的开源编程语言。该语言可以在许多平台上运行。它是一种将面向
- 1. System.Char 字符char 是 System.Char 的别名。System.Char 占两个字节,16个二进制位。Syst
- 又是兴趣系列网上有很多自动强红包的例子和代码,笔者也是做了一些优化。先说说自己的两个个优势1.可以在聊天界面自动强不依赖于通知栏推送 2.可
- Settings是WebView提供给上层App的一个配置Webview的接口,每个WebView都有一个WebSettings,要控制We
- 2015年Google IO大会分布了DataBinding库,能够更快捷便利的实现MVVM结构模式。但是,通过对DataBinding的学
- 符号 ASCII码 &
- 写了一个过滤器,根据需要限制edittext输入的整数和小数位,如下代码:package allone.verbank.apad.clien
- 本文实例讲述了C#使用linq语句查询数组中以特定字符开头元素的方法。分享给大家供大家参考。具体如下:下面的代码查询数组中以字母k开头的元素
- 现在的项目基本上都是java web项目,所以导入jar包会出现问题,主要介绍一下java项目与javaweb项目的区别:java项目:在c
- 本文实例为大家分享了Android studio点击跳转WebView的具体代码,供大家参考,具体内容如下代码文件import androi
- 一般来说一个 HTML 文档有很多标签,比如“<html>”、“<body>”、“<table>”等,想
- 1. 前言SpringBoot在包扫描时,并不会扫描子模块下的内容,这样就使得我们的子模块中的Bean无法注入到Spring容器中。Spri
- 这篇文章主要介绍了Java中遍历ConcurrentHashMap的四种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一
- Android 动画实现几种方案在 Android 的 FrameWork 中,为我们提供三种动画的实现方式:逐帧(Frame)动画、视图/
- package cn.response;import java.awt.Color;import java.awt.Font;import
- 复习了下数据结构,用Java的数组实现一下循环队列。队列的类//循环队列class CirQueue{ private int QueueS
- 一、原文翻译WorkManager API 可以很容易的指定可延迟的异步任务。允许你创建任务,并把它交给WorkManager来立即运行或在