java设计模式------工厂设计模式
总结
以上就是工厂模式的基本实现和详细说明。包括了简单工厂模式、工厂方法模式、抽象工厂模式。我们可以基于需求来选择合适的工厂模式
基本概念:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
分为三类:
简单工厂模式
Simple Factory:不利于产生系列产品;工厂方法模式
Factory Method:又称为多形性工厂;抽象工厂模式
Abstract Factory:又称为工具箱,产生产品族,但不利于产生新的产品;
这三种模式从上到下逐步抽象,并且更具一般性。GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。
先来看看它的组成:
- 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
- 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
- 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
简单工厂模式(Simple Factory Pattern)
从简单的工厂模式开始说起的话,我们要知道工厂模式的目的是什么?工厂模式的目的在于程序的可扩展性。而对于简单工厂模式来说,它是为了让程序有一个更好地封装,降低程序模块之间的耦合程度。
对于简单的工厂模式,其实也可以将其理解成为一个创建对象的工具类。工具类的形式,可以仿造如下代码编写:
public class SimpleFactory {
public Object create(Class<?> clazz) {
if (clazz.getName().equals(Plane.class.getName())) {
return createPlane();
} else if (clazz.getName().equals(Broom.class.getName())) {
return createBroom();
}
return null;
}
private Broom createBroom() {
return new Broom();
}
private Plane createPlane() {
return new Plane();
}
}
测试代码如下:
public class FactoryTest {
public static void main(String[] args) {
// 简单工厂模式测试
SimpleFactory simpleFactory = new SimpleFactory();
Broom broom = (Broom) simpleFactory.create(Broom.class);
broom.run();
}
}
正如之前所说的,简单的工厂模式,就是去创建一个创建对象的工具类。在这个工具类里面,我们就可以进行一些其他操作,比如对象的初始化。这样就避免了把对象初始化的大量代码(如果有大量代码的话)放在构造函数里了。
工厂方法模式(Factory Method Pattern)
之前说了简单的工厂模式,在简单的工厂模式里,我们创建了一个类似工具的类来创建相应的具体类对象。正因为其太过简单,有一点不成规范。所以,这里要对其做一些适当地封装。
我们来看一下工厂方法模式的定义吧。工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化哪一个。工厂方法让类把实例化推迟到了子类。(定义摘自《Head First设计模式》

我们的抽象工厂可以是类似这样的:
public abstract class VehicleFactory {
public abstract Moveable create();
}
具体工厂:
public class BroomFactory extends VehicleFactory {
@Override
public Moveable create() {
return new Broom();
}
}
这个具体的实现工厂告诉我们,这里可以通过 create() 方法来创建一个 Broom 对象。
我们可以这样来理解他们的关系:有一个大的工厂它就是 VehicleFactory,VehicleFactory工厂里又有很多生产车间,其中有一个就是 BroomFactory。我们的具体产品都是通过这些生产车间来负责生产的。
抽象产品接口:
说到了产品,我们可以先试想一下这些具体的产品都会有什么样的性质。我们可以这样来定义它们:
public interface Moveable {
public void run();
}
具体产品:
嗯,这是一些可以run(移动)的产品。就 BroomFactory 生产车间而言,它负责生产 Broom。这个 Broom 是具有 Moveable 的属性。那么它的实现可以这样来写:
public class Broom implements Moveable {
@Override
public void run() {
System.out.println("我是Broom.我在飞...");
}
}
功能测试:
我们有工厂,并且知道了工厂要生产的产品了。那么我们就来生产一个 Broom 来试试吧:
VehicleFactory factory = new BroomFactory();
Moveable moveable = factory.create();
moveable.run();
抽象工厂模式(Abstract Factory Pattern)
从上面的工厂方法中的结构图中,我们可以看到其中的具体工厂A和B是两个完全独立的。两者除了都是抽象工厂的子类,没有任何其他的交集。
但是,如果我们有这样一个需求:具体工厂A和B需要生产一些同类型的不同产品。那么我们就可以试试抽象工厂模式。
我们来看看抽象工厂模式是怎么定义的:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。同样在下面的结构图中,我们可以更好地解释这一定义。我们的抽象工厂中包含一系列的去构造一个抽象产品的方法,而具体产品的实现则是放在了具体工厂(图中的A和B)中进行。

现在我们看看代码中是如何实现的。
抽象工厂:
public abstract class AbstractFactory {
public abstract Flyable createFlyable();
public abstract Moveable createMoveable();
public abstract Writeable createWriteable();
}
具体工厂:
从抽象工厂的代码中也可以看出,抽象工厂只是去“生产”一些抽象的东西。有点类似于底层机制的感觉。现在我们来看看具体工厂的实现。
public class Factory1 extends AbstractFactory {
@Override
public Flyable createFlyable() {
return new Aircraft();
}
@Override
public Moveable createMoveable() {
return new Car();
}
@Override
public Writeable createWriteable() {
return new Pen();
}
}
抽象产品接口:
在具体工厂里,我们就可以生产一些具体的产品了。就是这里的Aircraft、Car、Pen。抽象的产品接口如下。
public interface Flyable {
public void fly(int height);
}
具体产品:
具体的产品则是要去实现这个接口,并实现其中的方法,如下:
public class Aircraft implements Flyable {
@Override
public void fly(int height) {
System.out.println("我是一架客运机,我目前的飞行高度为:" + height + "千米。");
}
}
功能测试:
有了这些东西,那么我们就来好好生产一些产品吧。
public class FactoryTest {
public static void main(String[] args) {
AbstractFactory factory = new Factory1();
Flyable flyable = factory.createFlyable();
flyable.fly(1589);
Moveable moveable = factory.createMoveable();
moveable.run(87.6);
Writeable writeable = factory.createWriteable();
writeable.write("Hello World.");
}
}
现在让我们来看一下,结果是否跟我们想的一样吧。

java设计模式------工厂设计模式的更多相关文章
- java简单工厂设计模式
一.基本定义 /* *简单工厂设计模式: *文字描述理解: * 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式. * 通过专门定义一个类来负责创建其它类的实例,被创建的实例通常 * 都具有共同 ...
- Java设计模式—工厂设计模式
工厂设计模式(减少耦合.通过接口或者工厂类来实现) 耦合性:粘度强(依耐性) Person p = new Person(); //耦合性强 Man p = new Per ...
- php设计模式-工厂设计模式
概念: 工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类步骤. 很多高级模式都是依赖于工厂模式.
- 【51】java设计模式-工厂设计模式剖析
工厂设计设计模式的分类: 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Factory Method) ...
- Java设计模式——工厂设计模式
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- Java基础-工厂设计模式(三锅的肥鸡)
---恢复内容开始--- 1)还没有工厂时代:假如还没有工业革命,如果一个你要一架飞机,一般的做法是自己去建造一架飞机,然后拿来开 通常的结果就是 有些时候 要么专科螺钉 没打好 要么就是 那个 ...
- Java基础面试操作题:Java代理工厂设计模式 ProxyFactory 有一个Baby类,有Cry行为,Baby可以配一个保姆 但是作为保姆必须遵守保姆协议:能够处理Baby类Cry的行为,如喂奶、哄睡觉。
package com.swift; public class Baby_Baomu_ProxyFactory_Test { public static void main(String[] args ...
- 10.Java设计模式 工厂模式,单例模式
Java 之工厂方法和抽象工厂模式 1. 概念 工厂方法:一抽象产品类派生出多个具体产品类:一抽象工厂类派生出多个具体工厂类:每个具体工厂类只能创建一个具体产品类的实例. 即定义一个创建对象的接口(即 ...
- Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
随机推荐
- PHP解码unicode编码中文字符代码
function replace_unicode_escape_sequence($match) { return mb_convert_encoding(pack('H*', $match[1]), ...
- VC++信息安全编程(13)Windows2000/xp/vista/7磁盘扇区读写技术
有些时候,我们读取磁盘文件,会被hook.我们读到的可能并非实际的文件. 我们直接读取磁盘扇区获取数据. 实现磁盘数据的读写,不依赖WindowsAPI. [cpp] view plaincopy v ...
- Flex的 Event中属性currentTarget与target的区别
Flex的 Event中属性currentTarget与target的区别 1.区别 (1)currentTarget是事件的处理对象(event processor) (2)target是事件的调用 ...
- ASP.NET Core 2.0 : 六. 举个例子来聊聊它的依赖注入
本文通过一个维修工与工具库的例子形象的描述一下为什么要用依赖注入.它的工作原理是什么样的, 然后根据这个类比一下ASP.NET Core 中的依赖注入, 从而深刻了解它的使用方法.注意事项以及回收机制 ...
- css 超出规定行数自动隐藏
单行overflow: hidden;text-overflow: ellipsis;white-space: nowrap; 多行(兼容各个浏览器)//通过覆盖最后几个字的形式p{positio ...
- Postman教程——发送第一个请求
系列文章首发平台为果冻想个人博客.果冻想,是一个原创技术文章分享网站.在这里果冻会分享他的技术心得,技术得失,技术人生.我在果冻想等待你,也希望你能和我分享你的技术得与失,期待. 前言 过年在家,闲来 ...
- Linux进行AES加密每次结果都不一致并且解密失败报错
1. 现象 windows操作系统下进行"123456"的AES加密 encrypted message is below : QLNYZyjRnKF/zxAjzDt/lw== d ...
- (luogu P1594)护卫队[TPLY]
(luogu P1594) 护卫队 题目链接 https://www.luogu.org/problemnew/show/P1594 很好的一个模型 题目大意 有一个有序的车队,要求将其分成若干段,每 ...
- 【BZOJ3680】吊打XXX(模拟退火)
[BZOJ3680]吊打XXX(模拟退火) 题面 BZOJ 题解 模拟退火... 就是模拟退火 然后这题有毒 各种调参数之后终于\(AC\)了.. 这种题就是玄学呀... 温度要调大 最后跑完还要向四 ...
- [JZOJ5511] 送你一个DAG
题目描述: 给出一个 \(n\) 个点 \(m\) 条边的 \(DAG\) 和参数 \(k\). 定义一条经过 \(l\) 条边的路径的权值为 \(l^k\). 对于 \(i = 1-n\), 求出所 ...