文档章节

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

_无问西东
 _无问西东
发布于 2018/08/18 22:30
字数 921
阅读 14
收藏 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)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

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

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

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
_无问西东
粉丝 2
博文 55
码字总数 90507
作品 0
朝阳
高级程序员
私信 提问
设计模式梳理(一)

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

lxq_xsyu
2017/11/02
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
228
2
设计模式之抽象工厂模式(创建型)

模式定义 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。 模式角色 抽象...

smileNicky
01/01
0
0
设计模式Java Design Pattern-工厂方法模式FactoryMethod

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

勇敢写信
2018/03/22
0
0
23种设计模式(3):抽象工厂模式

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。 类型:创建类模式 类图: 抽象工厂模式与工厂方法模式的区别 抽象工厂模式是工厂方法模式的升级版本,他用来...

LCZ777
2014/07/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rabbitMQ 在spring 的使用

一、准备工作 maven依赖 <dependency>  <groupId>com.rabbitmq</groupId>  <artifactId>amqp-client</artifactId>  <version>4.0.2</version></dependency> <dependency......

狼王黄师傅
昨天
1
0
Android JNI总结

0x01 JNI介绍 JNI是Java Native Interface的缩写,JNI不是Android专有的东西,它是从Java继承而来,但是在Android中,JNI的作用和重要性大大增强。 JNI在Android中起着连接Java和C/C++层的作...

天王盖地虎626
昨天
1
0
大数据教程(11.8)Hive1.2.2简介&初体验

上一篇文章分析了Hive1.2.2的安装,本节博主将分享Hive的体验&Hive服务端和客户端的使用方法。 一、Hive与hadoop直接的关系 Hive利用HDFS存储数据,利用MapReduce查询数据。 二、Hive与传统数...

em_aaron
昨天
3
0
跟我学Spring Cloud(Finchley版)-15-Hystrix监控详解

Hystrix提供了监控Hystrix Command的能力,本节来详细探讨。 监控端点与数据 应用整合Hystrix,同时应用包含spring-boot-starter-actuator 依赖,就会存在一个/actuator/hystrix.stream 端点...

周立_ITMuch
昨天
6
0
day26:shell题

1、 判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。 如果其生产商为AuthenticAMD,就显示其为AMD公司; 如果其生产商为GenuineIntel,就显示其为Intel公司; 否则,...

芬野de博客
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部