工厂模式

“对象创建”类模式

  • 通过”对象创建模式”绕开new,来避免对象创建new过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.
  • 典型模式:
    • Factory Method(工厂方法)
    • Abstract Factory(抽象工厂)
    • Prototype
    • Builder(建造者模式)

工厂方法

  • 动机:在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化.
  • 提出问题:如何应对这种变化?如何绕开常规的对象创建方法(new),提供一种”封装机制”避免客户程序和这种”具体对象创建工作”的紧耦合?
  • 工厂方法模式定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使得一个 类的实例化延迟(编译时延迟到运行时)到子类.

代码例子

常规代码设计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
abstract class ISplitter{
public abstract void split();
}

class BinarySplitter extends ISplitter{
@Override
public void split(){};
}

class TxtSplitter extends ISplitter{
@Override
public void split(){};
}

class PictureSplitter extends ISplitter{
@Override
public void split(){};
}

class VoiceSplitter extends ISplitter{
@Override
public void split(){};
}

1
2
3
4
5
6
7
class client {
public void run(){
//依赖具体的类,编译时创建类
ISplitter splitter = new BinarySplitter();
}
}

工厂方法改造

  • Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系.面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱
  • Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展的策略.
    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
    //抽象类
    abstract class ISplitter{
    public abstract void split();
    }

    class BinarySplitter extends ISplitter{
    @Override
    public void split(){};
    }

    class TxtSplitter extends ISplitter{
    @Override
    public void split(){};
    }

    class PictureSplitter extends ISplitter{
    @Override
    public void split(){};
    }

    class VoiceSplitter extends ISplitter{
    @Override
    public void split(){};
    }

    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
    //工厂基类
    abstract class SplitterFactory{
    public abstract ISplitter createSplitter();
    }

    //具体工厂
    class BinarySplitterFactory extends SplitterFactory {
    @Override
    public ISplitter createSplitter(){
    return new BinarySplitter();
    }
    }

    class TxtSplitterFactory extends SplitterFactory {
    @Override
    public ISplitter createSplitter(){
    return new TxtSplitter();
    }
    }

    class PictureSplitterFactory extends SplitterFactory {
    @Override
    public ISplitter createSplitter(){
    return new PictureSplitter();
    }
    }

    class VoiceSplitterFactory extends SplitterFactory {
    @Override
    public ISplitter createSplitter(){
    return new VoiceSplitter();
    }
    }

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

SplitterFactory factory;

public Client(SplitterFactory factory){
this.factory = factory;
}

public void run(){
//运行时创建对象
ISplitter splitter = factory.createSplitter();
}
}

抽象工厂模式

  • 动机:在软件系统中,经常面临 “一系列相互依赖的对象” 的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class IDBConnection{

    }

    class IDBCommend{

    }

    class IDataReader{

    }

    class MysqlConnection extends IDBConnection{

    }

    class MysqlCommend extends IDBCommend{

    }

    class MysqlDataReader extends IDataReader{

    }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
abstract class IDBFactory{
public abstract IDBConnection createDBConnection();
public abstract IDBCommend createDBConnection();
public abstract IDataReader createDataReader();
}

class MysqlDBFactory extends IDBFactory{
@Override
public IDBConnection createDBConnection(){
return new MysqlConnection();
}
@Override
public IDBCommend createDBConnection(){
return new MysqlCommend();
}
@Override
public IDataReader createDataReader(){
return new MysqlDataReader();
}
}

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

MysqlDBFactory factory;

public Client(SplitterFactory factory){
this.factory = factory;
}

public void run(){
//运行时创建对象
IDBConnection connection = factory.createDBConnection();
IDBCommend connection = factory.createDBCommend();
IDataReader connection = factory.createDataReader();
...
}
}