抽象工厂模式
– 简单工厂模式 :用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码)
– 工厂方法模式 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
– 抽象工厂模式 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
抽象工厂的结构:
- 抽象工厂:提供创建产品的接口,可以创建多个不同等级的产品。
- 具体工厂:完成具体产品的创建。
- 抽象产品:定义产品规范,描述特性和功能。
- 具体产品:实现具体的产品。
抽象工厂:
1 public interface Make {
2 /**
3 * 造酒的接口,制造52度的酒
4 * @return Liqueur
5 */
6 public Liqueur makeLiqueur52();
7
8 /**
9 * 造酒的接口,制造42度的酒
10 * @return Liqueur
11 */
12 public Liqueur makeLiqueur42();
13 }
具体工厂:制造闷倒驴工厂
1 /**
2 * 制造闷倒驴工厂(代表闷倒驴这一族)
3 */
4 public class MakeMdlFactory implements Make{
5
6 /**
7 * 制造52度闷倒驴
8 * @return 52度闷倒驴味道
9 */
10 @Override
11 public Liqueur makeLiqueur52() {
12 return new Mdl52();
13 }
14
15 /**
16 * 制造42度闷倒驴
17 * @return 42度闷倒驴味道
18 */
19 @Override
20 public Liqueur makeLiqueur42() {
21 return new Mdl42();
22 }
23 }
具体工厂:制造跑舌头工厂
1 /**
2 * 制造跑舌头工厂(代表跑舌头这一族)
3 */
4 public class MakePstFactory implements Make {
5
6 /**
7 * 制造52度跑舌头
8 * @return 52度跑舌头味道
9 */
10 @Override
11 public Liqueur makeLiqueur52() {
12 return new Pst52();
13 }
14
15 /**
16 * 制造42度跑舌头
17 * @return 42度跑舌头味道
18 */
19 @Override
20 public Liqueur makeLiqueur42() {
21 return new Pst42();
22 }
23 }
抽象产品:接口
1 public interface Liqueur {
2 public void taste();//酒味
3 }
抽象产品:闷倒驴抽象类
1 /**
2 * 闷倒驴抽象类
3 */
4 public abstract class Mdl implements Liqueur {
5 public abstract void taste();
6 }
抽象产品:跑舌头抽象类
1 /**
2 * 跑舌头抽象类
3 */
4 public abstract class Pst implements Liqueur {
5 public abstract void taste();
6 }
具体产品:42度闷倒驴
/**
* 42度闷倒驴
*/
public class Mdl42 extends Mdl {
@Override
public void taste() {
System.out.println("42度闷倒驴,辣的");
}
}
具体产品:52度闷倒驴
1 /**
2 * 52度闷倒驴
3 */
4 public class Mdl52 extends Mdl {
5 @Override
6 public void taste() {
7 System.out.println("52度闷倒驴,特别辣");
8 }
9 }
具体产品:42度跑舌头
1 /**
2 * 42度跑舌头
3 */
4 public class Pst42 extends Pst {
5 @Override
6 public void taste() {
7 System.out.println("42度跑舌头,苦的");
8 }
9 }
具体产品:52度跑舌头
1 /**
2 * 52度跑舌头
3 */
4 public class Pst52 extends Pst {
5 @Override
6 public void taste() {
7 System.out.println("52度跑舌头,特别苦");
8 }
9 }
测试:
1 public class LiqueurTest {
2
3 public static void main(String[] args){
4 Make mdlFactory = new MakeMdlFactory();
5 Liqueur mdl42 = mdlFactory.makeLiqueur42();
6 Liqueur mdl52 = mdlFactory.makeLiqueur52();
7 mdl42.taste();
8 mdl52.taste();
9
10 Make pstFactory = new MakePstFactory();
11 Liqueur pst42 = pstFactory.makeLiqueur42();
12 Liqueur pst52 = pstFactory.makeLiqueur52();
13 pst42.taste();
14 pst52.taste();
15 }
16 }
结果:
1 42度闷倒驴,辣的
2 52度闷倒驴,特别辣
3 42度跑舌头,苦的
4 52度跑舌头,特别苦
与工厂方法模式相比, 抽象工厂模式中的具体工厂不只是创建一种具体对象, 它负责创建一组(族)具体对象。
总结:用工厂模式主要是代替new操作,将创建对象统一管理和控制,从而将调用者与实现类解耦。