设计模式-工厂模式

工厂模式

  工厂模式是常见的5中创建型设计模式之一,主要用于新建对象场景。首先我们要明确为什么要使用工厂模式,在程序中new一个对象然后使用是最基本的需求,但是如果该对象发生一些改变或者派生出新对象,势必需要修改原代码,这样做破坏了开放封闭原则。所以我们希望又一个专门的类来产生我们要用的对象,使用时直接跟它请求需要的对象就好了,这样即使对象产生过程发生变化使用对象的类也不需要进行修改。其实可以认为new一个类是一种硬编码。这个时候工厂模式就能帮我们解决这个问题。工厂模式又细分为简单工厂、工厂方法和抽象工厂,下面我们来详细解释三种模式的结构。

举例分析

  话说有一位土豪想有一辆车,最直接的办法就是自己造,Benz奔驰、Bmw宝马、Audi奥迪,自己动手丰衣足食。但是自己造太麻烦还累,土豪有钱,费那个劲干啥,可以直接去工厂买啊。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

public abstract class Car {
...
}


public class Audi extends Car{
...
}


public class Bmw extends Car {
...
}

public class Benz extends Car{
...
}

  于是土豪来到了三个工厂考察。

简单工厂

  土豪来到了第一家小工厂,他想要的Benz、BMW、Audi都有,土豪很满意。我们看这个工厂是怎么生产汽车的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class CarFactory{

public static Car getCar(String type) throws Exception{
if(type.equals("Benz")){
return new Benz();
}else if(type.equals("Audi")){
return new Audi();
}else if(type.equals("Bmw")){
return new Bmw();
}else{
throw new Exception();
}
}

}

  土豪转念一想,这仨车太low,老子要布加迪,你能生产么。工厂领导傻眼了,他们工厂只能生产这三种车,要想生产其他的还要升级生产线。土豪一听,那我还是看看其他的工厂吧。

  简单工厂实现方式很简单,但是一但产品类型增加该方法又面临着修改,产品类型较多的时候逻辑复杂度会增加,不利于系统维护,依然不符合开闭原则。

工厂方法

  于是土豪来到了第二家工厂,这家工厂很大,总工厂下面有小工厂,生产线也是标准化的,能根据土豪的需要增加生产线,布加迪不是梦,土豪很满意。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

public interface class Factory{
Car createCar();
}

public class AudiFactory implements Factory{

public Car createCar(){
return new Audi();
}
}
public class BenzFactory implements Factory{

public Car createCar(){
return new Benz();
}
}
public class BmwFactory implements Factory{

public Car createCar(){
return new Benz();
}
}

  土豪很满意,但是又想了想平时需要开一辆商务车,撩妹子需要一辆跑车,让这个工厂单开一条生产线生产跑车再提车妹子都跑了,于是摇摇头继续考察第三家工厂。
  使用时创建一个具体的工厂,然后调用createCar方法即可。这种实现方式的缺点是没增加一种新车型,需要新建一个对应的factory类。

抽象工厂

  土豪来到了第三家工厂,这家工厂把车按品牌分类,每个品牌包括商务车和跑车,于是它旗下的商务车工厂专门生产各种品牌的商务车,跑车工厂专门生产各个品牌的跑车。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

public interface AudioCar{
...
}

public interface BWMCar{
...
}

public class AudioBusinessCar implements AudioCar{
...
}

public class AudioSportCar implements AudioCar{
...
}

public class BMWBusinessCar implements BMWCar{
...
}

public class BMWSportCar implements BMWCar{
...
}


public interface CarFactory{
AudioCar createAudioCar();
BMWCar createBMWCar();
}

public class BusinessCarFactory implements CarFactory{
public AudioCar createAudioCar(){
return new AudioBudinessCar();
}

public BMWCar createBMWCar(){
return new BMWBudinessCar();
}
}

public class SportCarFactory implements CarFactory{
public AudioCar createAudioCar(){
return new AudioSportCar();
}

public BMWCar createBMWCar(){
return new BMWSportCar();
}
}

  土豪一看很满意,直接提了两辆车回家。

  这种方式比较适合新增产品族,比如工厂扩大生产想生产轿车,直接增加一个轿车工厂就好了。但是如果新增产品,比如增加Benz车的跑车和商务车,那基本需要对所有类进行修改。

总结

  • 抽象工厂和工厂方法模式最大的区别在于工厂方法针对的是一个产品等级结构,而抽象工厂需要面对多个产品等级结构。
  • 当抽象工厂中只存在一个产品等级结构,抽象工厂退化成工厂方法模式
  • 当工厂方法模式中抽象工厂与具体工厂合并,提供一个统一的工厂来创建对象,并将创建对象的方法设置为静态方法时,工厂方法退化成简单工厂模式。
-------------本文结束感谢您的阅读-------------

本文标题:设计模式-工厂模式

文章作者:小建儿

发布时间:2018年08月06日 - 10:08

最后更新:2018年08月06日 - 10:08

原始链接:http://yajian.github.io/设计模式-工厂模式/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。