工廠方法:

一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。

定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。

这满足创建型模式中所要求的“创建与使用相分离”的特点。

解析:

被创建的对象称为“产品”
把创建产品的对象称为“工厂”

優點:

用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;

增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;

模式結構

抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 
    newProduct() 来创建产品。

具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。

抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。

具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

適用場景

编写代码的过程中, 如果无法预知对象确切类别及其依赖关系时, 可使用工厂方法。

将创建产品的代码与实际使用产品的代码分离, 从而能在不影响其他代码的情况下扩展产品创建部分代码。

希望用户能扩展你软件库或框架的内部组件, 可使用工厂方法。

問題:
继承可能是扩展软件库或框架默认行为的最简单方法。 但是当你使用子类替代标准组件时, 框架如何辨识出该子类? 解决方案是将各框架中构造组件的代码集中到单个工厂方法中, 并在继承该组件之外允许任何人对该方法进行重写。

复用现有对象来节省系统资源, 而不是每次都重新创建对象, 可使用工厂方法

實現方法

让所有产品都遵循同一接口。 该接口必须声明对所有产品都有意义的方法。

在创建类中添加一个空的工厂方法。 该方法的返回类型必须遵循通用的产品接口。

在創建者即抽象工廠中對抽象產品的構造函數做出引用。

為每一種產品編寫一個創建者子類。子类中重写工厂方法, 并将基本方法中的相关创建代码移动到工厂方法中。

簡單例子

/**
* 抽象接口:提供產品的接口
*/
public interface Product {
public void show();
}
/**
* 提供產品的抽象工廠
*/
public interface AbstractProductFactory {
public Product newProduct();
}
/**
* 具體產品:實現抽象產品接口
*/
public class ConcreteProduct1 implements Product{
public void show() {
System.out.println("具體產品1展示");
}
}
/**
* 具體工廠:實現抽象工廠裏的方法。
*/
public class ConcreteProductFactory1 implements AbstractProductFactory { public Product newProduct() {
System.out.println("具體工廠11---->具體產品2");
return new ConcreteProduct1();
}
}
public class FactoryTest {
public static void main(String[] args) {
/**
* 使用具體工程創建具體產品就行
*/
AbstractProductFactory cf = new ConcreteProductFactory1();
Product product1 = cf.newProduct();
product1.show();
/**
* re:
* 具體工廠11---->具體產品2
* 具體產品1展示
*/
}
}

便於理解的生活例子

正在开发一款物流管理应用。 最初版本只能处理卡车运输, 因此大部分代码都在位于名为 卡车的类中。

現在希望希望应用能够支持海上物流功能。

因爲大部分代码都与 卡车类相关。程序中添加 轮船类需要修改全部代码

解決方法:

工厂方法模式建议使用特殊的工厂方法代替对于对象构造函数的直接调用 (即使用 new运算符)。

对象仍将通过 new运算符创建, 只是该运算符改在工厂方法中调用罢了。

工厂方法返回的对象通常被称作 “产品”。

 可能大家有疑問:

我们只是改变了程序中调用构造函数的位置而已。

事實上

现在你可以在子类中重写工厂方法, 从而改变其创建产品的类型。

注意:

仅当这些产品具有共同的基类或者接口时, 子类才能返回不同类型的产品,

同时基类中的工厂方法还应将其返回类型声明为这一共有接口

java-設計模式-工場方法的更多相关文章

  1. memcached+狀態模式+工廠方法使用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. IC芯片設計

    IC從生產目的上可以分成為通用IC(如CPU,DRAM,接口芯片等)和ASIC(ApplicationSpecificIntegreted Circuit)兩種,ASIC是因應專門用途而生產的IC.  ...

  3. java-設計模式-單例模式

    單例模式 一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点. 一个类只有一个实例,且该类能自行创建这个实例的一种模式. 簡單的對比就是: 例如,Windows 中 ...

  4. java-設計模式概述

    什麽是設計模式?? 软件设计中常见问题的典型解决方案. 能根据需求进行调整的预制蓝图, 可用于解决代码中反复出现的设计问题. 模式并不是一段特定的代码, 而是解决特定问题的一般性概念. 你可以根据模式 ...

  5. java-設計模式-抽象工場模式

    抽象工廠模式AbstractFactory 一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类. 工廠方法模式中考虑的是一类产品的生产,如畜牧场只养动物.电视机厂只生产电视机,同种类 ...

  6. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  7. Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

  8. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  9. Java设计模式学习记录-简单工厂模式、工厂方法模式

    前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...

随机推荐

  1. vue3-hash-calendar,一款基于vue3.x开发的移动端日期时间选择组件

    在大家的催更下,鸽了一天又一天,vue3-hash-calendar 终于在今天诞生了. 按照惯例,先上效果图 Demo 扫描上方二维码或者请用浏览器的手机模式查看:https://www.hxkj. ...

  2. 【C# 线程】优先级反转与优先级继承

    什么是优先级反转(翻转)优先级反转,是指在使用信号量时,可能会出现的这样一种不合理的现象,即:    高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度.但其他中等优先级的任务却能抢到CP ...

  3. C#依赖注入-初步概念了解

    维基百科说:"依赖注入是一种软件设计模式,在这种模式下,一个或更多的依赖(或服务)被注入(或者通过引用传递)到一个独立的对象(或客户端)中,然后成为了该客户端状态的一部分.该模式分离了客户端 ...

  4. docker:nginx+confd动态生成配置

    docker:nginx+confd动态生成配置 当我们项目越来越多时手动去服务器修改nginx配置是一件很麻烦而且可能出错的事情.我们可以通过nginx+confd+配置中心实现一套方案避免出错并减 ...

  5. javaweb添加日常基本依赖

    <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql ...

  6. linux多进/线程编程(7)——多线程1(线程的创建,回收,分离,设置线程属性等)

    参考资料: 1.博客1:https://blog.csdn.net/zhou1021jian/article/details/71531699 2.博客2:https://blog.csdn.net/ ...

  7. Spring源码之七registerListeners()及发布订阅模式

    Spring源码之七registerListeners()及发布订阅模式 大家好,我是程序员田同学. 今天带大家解读refresh()方法中的registerListeners()方法,也就是我们经常 ...

  8. java内存区域模型和详解

    一,概述 java虚拟机运行时数据区模型图: 主要包括:程序计数器,java虚拟机栈,本地方法栈,java 堆,方法区(元空间). 其中堆和方法区由所有线程共享的数据区:程序计数器,java虚拟机栈, ...

  9. Windows原理深入学习系列-访问控制列表-关于安全描述符的补充

    这是[信安成长计划]的第 20 篇文章 0x00 目录 0x01 安全描述符的结构 0x02 两个结构的不同点 0x03 真正的查询方案 0x04 参考文章 0x01 安全描述符的结构 在上一篇文章中 ...

  10. LeetCode-049-字母异位词分组

    字母异位词分组 题目描述:给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例说明请见LeetCode官网. 来源:力扣(LeetCode) 链接:https: ...