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设计模式学习记录-简单工厂模式、工厂方法模式
前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...
随机推荐
- 有关SQL(2012)突然无法连接服务器的问题解答
Sql Server无法启动的4中原因:(先得分析出问题所在) 原文地址:http://www.cnblogs.com/JiangLe/p/4000497.html SQL Server 无法启动的原 ...
- Hive复杂数组字典(Json-Array)解析
数据存储字段格式如下(Json-Array互相嵌套): string='{"id":"9088848902695992720","title" ...
- 2019CCPC Final K. Russian Dolls on the Christmas Tree
题目大意 一棵 \(n(1\leq n\leq 2\times 10^5)\) 个节点以 \(1\) 为根的树,分别求以 \(1\sim n\) 为根的子树中有多少个节点编号连续的段. \(T(1\l ...
- pandas模块篇(之二)
今日内容概要 布尔选择器 索引 数据对齐 数据操作(增出改查) 算术方法 DataFrame(Excel表格数据) 布尔选择器 import numpy as np import pandas as ...
- jq获取不包含某些属性的元素
最近写项目,有个功能实现checkbox全选,但是被禁用的checkbox不能选中 点击全选后发现禁用checkbox的也被选中了,不符合需求. 但是想了半天,属性选择器都是判断某个属性值的,没有判断 ...
- 借助DBHelper实现学生管理案例分析
一.案例功能的实现 数据: --专业 create table ProfessionInfo ( ProfessionID int primary key identity(1,1), --专业编号 ...
- 从刘维尔方程到Velocity-Verlet算法
技术背景 我们说分子动力学模拟是一个牛顿力学的过程,在使用量子化学的手段或者深度学习的方法或者传统的力场方法,去得到某个时刻某个位置的受力之后,就可以获取下一步的整个系统的状态信息.这个演化的过程所使 ...
- Java学习笔记:01面向对象-继承
01面向对象-继承 一.java中的数据类型 1.基本数据类型:四类 八种 byte(1) boolean(1) short(2) char(2) int(4) float(4) long(8) do ...
- SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据
SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...
- LGP6788题解
太慢了!太慢了!我的替身 [The World] 是最强的替身! \(O(n^{\frac 2 3})\) 的解法!不清楚用 sbt 能不能更快一些,可能会吧.灵感来源于BZOJ4176,同时也可看到 ...