博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java设计模式——工厂模式
阅读量:5877 次
发布时间:2019-06-19

本文共 4076 字,大约阅读时间需要 13 分钟。

前言

  工厂模式是一种比較常见的创建模式。有时。可能你使用了工厂模式而你却还不知道你已经使用了它。至少我感觉以下说的第一种简单工厂模式,你是已经非常熟悉了。

而且是常常使用的。不信,就继续向下看。

版权说明

著作权归作者全部。

商业转载请联系作者获得授权,非商业转载请注明出处。
本文作者:
发表日期: 2016年4月14日
本文链接:
来源:CSDN
很多其它内容:

简单工厂模式(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设计模式》)

图-1 工厂方法模式

抽象工厂:

我们的抽象工厂能够是相似这种:

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();
这样我就生产了一个 Broom 了。是不是 so easy?

抽象工厂模式(Abstract Factory Pattern)

从上面的工厂方法中的结构图中,我们能够看到当中的详细工厂A和B是两个全然独立的。两者除了都是抽象工厂的子类,没有不论什么其它的交集。

可是,假设我们有这样一个需求:详细工厂A和B须要生产一些同类型的不同产品。那么我们就能够试试抽象工厂模式。

我们来看看抽象工厂模式是怎么定义的:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的详细类。相同在以下的结构图中,我们能够更好地解释这一定义。我们的抽象工厂中包括一系列的去构造一个抽象产品的方法,而详细产品的实现则是放在了详细工厂(图中的A和B)中进行。

图-2 抽象工厂模式

如今我们看看代码中是怎样实现的。

抽象工厂:

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.");    }}
  如今让我们来看一下,结果是否跟我们想的一样吧。

图-3 抽象工厂模式执行结果图

总结

以上就是工厂模式的基本实现和详细说明。

包括了简单工厂模式、工厂方法模式、抽象工厂模式。

我们能够基于需求来选择合适的工厂模式。

以下给出本文的全部代码的GitHub链接。

GitHub源代码链接

你可能感兴趣的文章
POJ 1915-Knight Moves (单向BFS && 双向BFS 比)
查看>>
java中在linux下利用jstack检测死锁
查看>>
linux编译安装LAMP
查看>>
php中的continue用法
查看>>
Android小游戏应用---撕破美女衣服游戏
查看>>
TextKit简单示例
查看>>
网格最短路径算法(Dijkstra & Fast Marching)(转)
查看>>
最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)
查看>>
软链接和硬链接详解
查看>>
HTML5 video 视频标签 常用属性
查看>>
深入理解javascript对象系列第一篇——初识对象
查看>>
Redis_master-slave模式
查看>>
qemu安装
查看>>
多媒体开发之rtmp---rtmp client 端的实现
查看>>
3.使用Maven构建Web项目
查看>>
iView实现自定义Modal
查看>>
如何在云帮上配置https
查看>>
JQuery干货篇之插入元素
查看>>
Imperva开源域目录控制器,简化活动目录集成
查看>>
可观察性驱动开发,探索未知之地
查看>>