抽象工厂设计模式

前言

抽象工厂方法通俗的讲就是为创建一组相关或相互依赖的对象提供一组接口,无需指定他们的具体类。因此,他们通常为创建一族产品对象,并且该产品由不同等级划分。

这里还是以之前的例子为例,假设有一个产生top(上单)的机器,另一个产生Jungle(打野)的机器,同时top可以有ad(物理上单)和ap(法术上单),同样,Jungle可以有ad和ap打野,现在需要一个工厂,可以同时产生仅含ad的打野和上单,另一个产生仅含ap的打野和上单,当然可以按照自己的组合
Alt text
打野

1
2
3
4
5
6
7
8
9
10
11
12
public interface Jungle {
//gank能力强
public void gankenemy();
//本身足够灵活
public void flexible();
//打野不太伤
public void killbeast();
}

ad打野

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class AdJungle implements Jungle {
@Override
public void gankenemy() {
// TODO Auto-generated method stub
}
@Override
public void flexible() {
// TODO Auto-generated method stub
}
@Override
public void killbeast() {
// TODO Auto-generated method stub
}
}

ap打野

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ApJungle implements Jungle {
@Override
public void gankenemy() {
// TODO Auto-generated method stub
}
@Override
public void flexible() {
// TODO Auto-generated method stub
}
@Override
public void killbeast() {
// TODO Auto-generated method stub
}
}

上单

1
2
3
4
5
6
7
8
9
10
public interface Top {
//gank能力强
public void gankenemy();
//本身足够灵活
public void flexible();
//打野不太伤
public void killbeast();
}

ad上单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class AdTop implements Top {
@Override
public void gankenemy() {
// TODO Auto-generated method stub
}
@Override
public void flexible() {
// TODO Auto-generated method stub
}
@Override
public void killbeast() {
// TODO Auto-generated method stub
}
}

ap上单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ApTop implements Top {
@Override
public void gankenemy() {
// TODO Auto-generated method stub
}
@Override
public void flexible() {
// TODO Auto-generated method stub
}
@Override
public void killbeast() {
// TODO Auto-generated method stub
}
}

生产打野和上单的工厂

1
2
3
4
public interface AbstractFactory {
public Top factorytop();
public Jungle factoryjungle();
}

生产ad打野和上单的工厂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class AdFactory implements AbstractFactory {
@Override
public Top factorytop() {
// TODO Auto-generated method stub
return new AdTop();
}
@Override
public Jungle factoryjungle() {
// TODO Auto-generated method stub
return new AdJungle();
}
}

生产ap打野和上单的工厂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ApFactory implements AbstractFactory {
@Override
public Top factorytop() {
// TODO Auto-generated method stub
return new ApTop();
}
@Override
public Jungle factoryjungle() {
// TODO Auto-generated method stub
return new ApJungle();
}
}

通过上面例子,我们可以发现抽象工厂易于交换产品系列,通过按需改变具体工厂从而使用不同的产品配置,同时它也将创建实例的过程与客户端分类

当然它的缺点就是和简单工厂一样,如果要从sql server切换到mysql,需要重新实例很多次

最后对应工厂系列的设计模式,无论选择哪一个,最终的目的都是为了解耦!

热评文章