文档章节

设计模式:工厂方法模式(工厂模式)

_无问西东
 _无问西东
发布于 08/18 22:30
字数 921
阅读 13
收藏 0

工厂方法模式才是真正的工厂模式,前面讲到的静态工厂模式实际上不能说是一种真正意义上的设计模式,只是一种变成习惯。

工厂方法的类图:

这里面涉及到四个种类:

1、抽象产品: Product

2、具体产品:ConcreteProduct

3、抽象工厂:Factory

4、具体工厂:ConcreateFactory

下面实际例子说明

/**
 * 抽象工厂类:CarFactory
 */
public abstract class  CarFactory {
    public abstract <T extends Car>T createCar(Class<T> clazz);

}




/**
 * 具体工厂类:ChinaCarFactory
 */
public class ChinaCarFactory extends CarFactory {
    @Override
    public <T extends Car> T createCar(Class<T> clazz) {
        String className = clazz.getName();
        Car car = null;
        try {
            car = (Car) Class.forName(className).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (T) car;
    }
}


/**
 * 抽象产品类:Car
 */
public abstract class Car {
    /**
     * 产品抽象方法,将会由具体产品类实现
     */
    public abstract void driving();
}



/**
 * 具体产品类:BenZCar
 */
public class BenZCar extends Car {
    @Override
    public void driving() {
        System.out.println("BenZCar is Driving!!!");
    }
}


/**
 * 具体产品类:BMWCar
 */
public class BMWCar extends Car {
    @Override
    public void driving() {
        System.out.println("BMWCar is Driving!!!");
    }
}


测试:
CarFactory carFactory = new ChinaCarFactory();
BMWCar bmw = carFactory.createCar(BMWCar.class);
bmw.driving();

CarFactory carFactory = new ChinaCarFactory();
BenZCar benZCar = carFactory.createCar(BenZCar.class);
benZCar.driving();

打印结果
I/System.out: BMWCar is Driving!!!
I/System.out: BenZCar is Driving!!!

上面是一个简单的例子,但是能够看出来,工厂方法使得一个类的初始化延迟到了子类,至于生产出什么产品工厂自己是不知道的,完全由外部控制,这里就是个“依赖倒置”,前面的简单工厂模式,高层的工厂类依赖于下层的各个具体产品类,当要增加类型的时候上层会跟着变动,依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。

上面的工厂方法模式中,具体的工厂类完全不会依赖于具体产品类了,而是依赖于与其父类--抽象工厂同在一个层次的抽象产品类,至于具体会生产出什么具体产品完全由外部控制,具体的工厂类处于下层,抽象的产品类处于上层,刚好倒置过来。

上面代码对应的UML类图如下:

 

借用一下百度来的概念:

依赖倒置原则

A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。

B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

面向过程的开发,上层调用下层,上层依赖于下层,当下层剧烈变动时上层也要跟着变动,这就会导致模块的复用性降低而且大大提高了开发的成本。

面向对象的开发很好的解决了这个问题,一般情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细节也依赖于抽象。即使实现细节不断变动,只要抽象不变,客户程序就不需要变化。这大大降低了客户程序与实现细节的耦合度

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
_无问西东
粉丝 1
博文 55
码字总数 90507
作品 0
朝阳
高级程序员
私信 提问
设计模式: Java中的工厂设计模式

原文链接 https://github.com/shellhub/blog/issues/22 前言 工厂设计模式(Factory Design Pattern)属于创建模式之一,工厂设计模式在JDK,Spring,Stuts被广泛使用 当一个类或者接口有多个子类...

shellhub
08/22
0
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模式、工厂方法模式、单例设计模式之饿汉式和懒汉式、Runtime类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52717096 JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模...

Aduroidpc
2016/10/01
0
0
设计模式知识汇总(附github分享)

写在前面 主要内容 为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也...

landy8530
10/10
0
0
设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信
03/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

工作中如何做好技术积累

参考:https://tech.meituan.com/study_vs_work.html 看了这篇文章,觉得总结得非常好,因此摘抄了一些关键点,以便自己经常翻阅。 引言 在繁忙的工作中做好技术积累,构建个人核心竞争力. 在...

grace_233
25分钟前
1
0
day146-2018-11-13-英语流利阅读-待学习

5 岁“牛娃”简历给 985 精英一个暴击 Lala 2018-11-13 1.今日导读 “不要让孩子输在起跑线上”,似乎已成为了当下最流行的名句,每个身为家长或还未成为家长的人都不得不思考这句话的分量。...

飞鱼说编程
38分钟前
3
0
Mariadb二进制包安装,Apache安装

安装mariadb 下载二进制包并解压 [root@test-a src]# wget https://downloads.mariadb.com/MariaDB/mariadb-10.2.6/bintar-linux-glibc_214-x86_64/mariadb-10.2.6-linux-glibc_214-x86_64.t......

野雪球
今天
4
0
ConcurrentHashMap 高并发性的实现机制

ConcurrentHashMap 的结构分析 为了更好的理解 ConcurrentHashMap 高并发的具体实现,让我们先探索它的结构模型。 ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEnt...

TonyStarkSir
今天
5
0
大数据教程(7.4)HDFS的java客户端API(流处理方式)

博主上一篇博客分享了namenode和datanode的工作原理,本章节将继前面的HDFS的java客户端简单API后深度讲述HDFS流处理API。 场景:博主前面的文章介绍过HDFS上存的大文件会成不同的块存储在不...

em_aaron
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部