java-設計模式-工場方法
工廠方法:
一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。
定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。
这满足创建型模式中所要求的“创建与使用相分离”的特点。
解析:
被创建的对象称为“产品”
把创建产品的对象称为“工厂”
優點:
用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程; 增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
模式結構
抽象工厂(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-設計模式-工場方法的更多相关文章
- memcached+狀態模式+工廠方法使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- IC芯片設計
IC從生產目的上可以分成為通用IC(如CPU,DRAM,接口芯片等)和ASIC(ApplicationSpecificIntegreted Circuit)兩種,ASIC是因應專門用途而生產的IC. ...
- java-設計模式-單例模式
單例模式 一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点. 一个类只有一个实例,且该类能自行创建这个实例的一种模式. 簡單的對比就是: 例如,Windows 中 ...
- java-設計模式概述
什麽是設計模式?? 软件设计中常见问题的典型解决方案. 能根据需求进行调整的预制蓝图, 可用于解决代码中反复出现的设计问题. 模式并不是一段特定的代码, 而是解决特定问题的一般性概念. 你可以根据模式 ...
- java-設計模式-抽象工場模式
抽象工廠模式AbstractFactory 一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类. 工廠方法模式中考虑的是一类产品的生产,如畜牧场只养动物.电视机厂只生产电视机,同种类 ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- Java设计模式学习记录-简单工厂模式、工厂方法模式
前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...
随机推荐
- 神奇!这款 Vue 后台框架居然不用手动配置路由
前言 做 Vue 开发脱离不了路由,尤其是中大型项目,页面多且杂,在配置路由的时候总是会变得逐渐暴躁,因为费时,并且又没有什么太多技术含量,总觉得是在浪费时间. 另外如果接手了别人的项目,当业务有变更 ...
- kali各工具使用介绍
各工具kali官方简介(竖排):https://tools.kali.org/tools-listing 安装kali虚拟机可参考:https://www.cnblogs.com/lsdb/p/650 ...
- windev中自定义选定列的使用和注意事项
windev系统默认的多选,需要使用Ctrl+或者Shift+来点选,使用并不方便,所以我们一般在首列增加checkbox列,并在行头增加一个checkbox控制,作为全选使用.使用这个方法时,有几个 ...
- 使用while循环和for循环输出2~100之间的素数(只能被1和自己整除的自然数)
不管是while循环还是for循环,原理都是取根号,循环到取根号后的数,至于为什么需要循环到开根后的数,我想主要是因为一个数的分解因子在开根号后的数向上取整以下吧. 话不多说,上代码: while循环 ...
- 如何修改oracle数据库用户密码过期策略
转至:https://www.cnblogs.com/zhangshuaihui/p/11451590.html 1. 查询数据库用户何时过期 登陆数据库PL/SQL工具,输入以下sql语句: s ...
- Qt:使用SqlQuery进行查询时size总是-1
原因:SQL语句没有符合格式,特别是在换行写一个SQL语句时,不同行之间没有写空格
- JZ-063-数据流中的中位数
数据流中的中位数 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两 ...
- 【译】ASP.NET Core 6 中的性能改进
原文 | Brennan Conroy 翻译 | 郑子铭 受到 Stephen Toub 关于 .NET 性能的博文的启发,我们正在写一篇类似的文章来强调 6.0 中对 ASP.NET Core 所做 ...
- JAVA基础01----第1章Java开发环境搭建
一. Java开发环境中涉及的名词:JDK,JRE,JVM A:什么是JVM JVM是java虚拟机(JVM Java Virtual Machine),java程序需要运行在虚拟机上,不同平台有自己 ...
- OSPF协议原理及配置2-理解邻居和邻接关系
OSPF是一个动态路由协议,运行OSPF的路由器之间需要交换链路状态信息和路由信息,在交换这些信息之前首先需要建立邻接关系.邻接关系用来交换链路状态及路由信息. 注意:并非所有的邻居关系都可以成为邻接 ...