设计模式3-工厂模式

定义

工厂模式是一种创建型模式,在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

三种工厂模式的定义、示例

1、简单工厂模式

简单工厂模式和策略模式很像,不过是创建了实例。

工厂模式首先需要定一个接口规则

1
2
3
public interface Runner{
void run();
}

然后需要通过工厂模式生成的类,都需要继承这个接口,以达到统一的目的。

1
2
3
4
5
6
public class LiuXiang implement Runner{
@Override
public void run(){
//刘翔开始跑路了~!
}
}
1
2
3
4
5
6
public class Bolt implement Runner{
@Override
public void run(){
//博尔特开始跑路了~!
}
}

如上,我们将博尔特和刘翔都抽象成了跑步者。然后我们实现跑步者生产工厂

1
2
3
4
5
6
7
8
9
public class RunnerFactory{
public Runner createRunner(Condition condition){
if(condition.xxxx){
return new LiuXiang();
}else{
return new Bolt();
}
}
}

通过传入的条件,来决定生产哪一类跑者。

这就是简单工厂模式,主要职责是生产实例

2、工厂方法模式

工厂方法模式抽象一些,主要是将生成具体产品的任务发给具体的产品工厂。

1
2
3
public interface AbstractRunnerFactory{
Runner provideRunner();
}

国家是个抽象对象,功能是提供运动员

1
2
3
4
5
6
public class ChinaRunnerProvider implements AbstractRunnerFactory{
@Override
public Runner provideRunner(){
return new LiuXiang();
}
}
1
2
3
4
5
6
public class USRunnerProvider implements AbstractRunnerFactory{
@Override
public Runner provideRunner(){
return new Bolt();
}
}

这样子我们拥有两个生产运动员的工厂国家了。

1
2
3
4
5
6
public class Test{
public static void main(String[] args){
AbstractCountry china = new China();
china.provideRunner();//生产出了运动员
}
}

3、抽象工厂模式

以上两种模式只可以生产一种商品。
需要外加一种商品,则不是很容易。因此需要再次抽象一层,最外层基于需求提供工厂,而内层则是工厂生产对象。

1
2
3
public interface AbstractSwimmerFactory{
Swimmer provideSwimmer();
}
1
2
3
4
5
6
public class ChinaSwimmerFactory implement AbstractSwimmerFactory{
@Override
public Swimmer provideSwimmer(){
return new SunYang();
}
}
1
2
3
4
5
6
public class USSwimmerFactory implement AbstractSwimmerFactory{
@Override
public Swimmer provideSwimmer(){
return new Phelps();
}
}
1
2
3
4
public interface AbstractFactory{
Runner provideRunner();
Swimmer provideSwimmer();
}
1
2
3
4
5
6
7
8
9
10
11
public class ChinaFactory implement AbstractFactory{
@Override
public Runner provideRunner(){
return new ChinaRunnerFactory().provdeRunner();
}

@Override
public Swimmer provideSwimmer(){
return new ChinaSwimmerFactory().provideSwimmer();
}
}
1
2
3
4
5
6
7
8
9
10
11
public class USFactory implement AbstractFactory{
@Override
public Runner provideRunner(){
return new USRunnerFactory().provideRunner();
}

@Override
public Swimmer provideSwimmer(){
return new USSwimmmerFactory().provideSwimmmer();
}
}

这样子,ChinaFactory 就是ChinaSwimmerFactory和ChinaRunnerFactory这两个工厂的工厂了。同时提供了多个实例的生产方式。

脱离了生产的细节,而将细节分离开来,细节由工厂实现,提供实例则由抽象工厂实现。