chenhang 的博客

HansChen 的博客

马上订阅 chenhang 的博客 RSS 更新: http://blog.hanschen.site/atom.xml

设计模式之工厂模式(Factory)

2016年11月26日 00:00

概述

根据依赖倒置原则,我们知道,我们应优先依赖抽象类而不是具体类。在应用开发过程中,有很多实体类都是非常易变的,依赖它们会带来问题,所以我们更应该依赖于抽象接口,已使我们免受大多数变化的影响。
工厂模式(Factory)允许我们只依赖于抽象接口就能创建出具体对象的实例,所以在开发中,如果具体类是高度易变的,那么该模式就非常有用。

接下来我们就通过代码举例说明什么是工厂模式

简单工厂模式

假设我们现在有个需求:把一段数据用Wi-Fi或者蓝牙发送出去。
需求很简单是吧?刷刷刷就写下了以下实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private String mode; //Wi-Fi|Bluetooth

public void onClick() {
byte[] data = {0x00, 0x01};

if ("Wi-Fi".equals(mode)) {
sendDataByWiFi(data);
} else {
sendDataByBluetooth(data);
}
}

private void sendDataByWiFi(byte[] data) {
// send data via Wi-Fi
}

private void sendDataByBluetooth(byte[] data) {
// send data via Bluetooth
}

但是上面的代码扩展性并不高,违反了开放封闭原则。比如现在又有了个新的需求,需要用zigbee把数据发送出去,就得再新增一个sendDataByZigbee方法了,而且还得修改onClick里面的逻辑。那么比较好的方法是怎么样的呢?

定义一个数据发送器类:

1
2
3
4
5
6
7
8
9
/**
* 数据发送器Sender
*
* @author HansChen
*/
public interface Sender {

void sendData(byte[] data);
}

实现WiFi数据发送:

1
2
3
4
5
6
7
8
9
10
11
12
/**
* Sender的实现类,通过Wi-Fi发送数据
*
* @author HansChen
*/
public class WiFiSender implements Sender {

@Override
public void sendData(byte[] data) {
System.out.println("Send...

剩余内容已隐藏

查看完整文章以阅读更多