设计模式-03-工厂模式

设计模式专题-03-工厂模式

个人github地址:HibisciDai

设计模式系列项目源码:HibisciDai/DesignPattern-LearningNotes-HibisciDai

processon在线UML类图:processon

[TOC]

设计模式-03-工厂模式

工厂模式(Factory Pattern)

简单工厂

对象创建的过程过于繁琐和庞大,可能进行同类型扩展,将类的创建单独放在一个类中进行,这个类叫工厂。
在工厂模式中,在创建对象受不会对客户暴露创建逻辑,通过共同的接口来指向新的创建对象。
创建过程延迟到子类进行,让子类决定实例化那个工厂。

意图

定义一个用于创建对象的接口,让子类决定实例化哪个类,一个类的创建延迟到其子类,这个类叫工厂。

主要解决

接口选择。

何时使用

明确计划不同条件下创建不同实例。

关键代码

创建过程在其子类执行。

应用实例

Hibienate换数据库只需要换方言和驱动就可以。

优点

  • 一个调用者想创建一个对象,只要知道其名称就可以了。
  • 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
  • 屏蔽产品的具体实现,调用者只关心产品的接口。

缺点

新产品增加需要增加具体类和实现工厂,个数成倍增加,增加系统复杂度。

案例1

类图

扩展前:

扩展后:

代码

pattern03.factory.demo1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public interface IFactory {
IMonster create();
}
public interface IMonster {
void show();
}
public class ULtraman implements IMonster {
@Override
public void show() {
System.out.println("正义使者");
}
}
public class ULtramanFactory implements IFactory {
@Override
public IMonster create() {
return new ULtraman();
}
}

测试输出

1
2
3
4
5
6
public class Main {
public static void main(String[] args) {
IFactory a = new ULtramanFactory();
a.create().show();
}
}
1
正义使者

案例2

不同数据库有不同的数据驱动,由用户指定不同的数据驱动。

类图

代码

pattern03.factory.demo2

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
51
52
53
54
55
56
57
58
59
60
61
62
public interface Helper {
public void open();

public void operation();

public void close();
}

public class SQLHelper implements Helper {

@Override
public void open() {
System.out.println("SQLHelper-open");
}

@Override
public void operation() {
System.out.println("SQLHelper-operation");
}

@Override
public void close() {
System.out.println("SQLHelper-close");
}
}

public class OracleHelper implements Helper {

@Override
public void open() {
System.out.println("OracleHelper-open");
}

@Override
public void operation() {
System.out.println("OracleHelper-operation");
}

@Override
public void close() {
System.out.println("OracleHelper-close");
}
}

public interface Factory {
public Helper create(String helperType);
}

public class MyFactory implements Factory {

@Override
public Helper create(String helperType) {
if (null == helperType) {
return null;
} else if (helperType.equalsIgnoreCase("SQLHelper")) {
return new SQLHelper();
} else if (helperType.equalsIgnoreCase("OracleHelper")) {
return new OracleHelper();
}
return null;
}
}

测试输出

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
public static void main(String[] args) {
Factory myFactory = new MyFactory();
Helper helper1 = myFactory.create("SQLHelper");
helper1.open();
helper1.operation();
helper1.close();
Helper helper2 = myFactory.create("OracleHelper");
helper2.open();
helper2.operation();
helper2.close();
}
}
1
2
3
4
5
6
SQLHelper-open
SQLHelper-operation
SQLHelper-close
OracleHelper-open
OracleHelper-operation
OracleHelper-close
文章作者: HibisciDai
文章链接: http://hibiscidai.com/2018/03/21/设计模式-03-工厂模式/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HibisciDai
好用、实惠、稳定的梯子,点击这里