抽象工厂相比于前两种工厂,应用场景少一些,但在特殊场景下,也能发挥非常好的作用。
抽象工厂用在哪写场景?
还是基于前两节的例子,基于果汁和酸奶的例子,如果现在我们不仅只生产饮品,还要生产苹果味的饼干,此时要怎么做呢?
按照工厂方法模式,需要再建立一个苹果饼干工厂来生产苹果饼干,如果还需要苹果为果冻,那就需要再建立苹果味果冻工厂,如果还需要…,结果就是要建立一大堆对应的工厂,这样的结果就是维护困难,而且代码也不友好。
此时就可以使用抽象工厂,抽象工厂的作用就是,在抽象工厂中定义不只一种产品的生产,然后由具体工厂实现,这样一个具体工厂就可以包含多种产品的生产了,工厂数量就减少了,类也就少了。
角色包括:
抽象工厂:定义多种产品的生产
具体工厂:继承抽象工厂,实现抽象工厂中定义的多种产品
抽象产品:定义产能特性
具体产品:生产具体产品
代码:
1、定义抽象工厂
package com.itzhimei.study.design.factory.abstractfactory;
public interface IAppleFactory {
/**
* 定义果汁方法
* @return
*/
IFruitsJuice getFruitsJuice();
/**
* 定义水果饼干方法
* @return
*/
IFruitsCookie getFruitsCookie();
}
抽象工厂的核心就在上面这里,这里由两个生产方法。
2、定义具体工厂,实现生产各类产品
package com.itzhimei.study.design.factory.abstractfactory;
/**
* www.itzhimei.com
* 具体工厂
*/
public class AppleFactory implements IAppleFactory {
@Override
public IFruitsJuice getFruitsJuice() {
return new AppleJuice();
}
@Override
public IFruitsCookie getFruitsCookie() {
return new AppleCookie();
}
}
3、定义抽象产品和实现抽象产品的具体产品
package com.itzhimei.study.design.factory.abstractfactory;
/**
* www.itzhimei.com
* 果汁接口
*/
public interface IFruitsJuice {
/**
* 定义果汁方法
* @return
*/
String getFruitsJuice();
}
package com.itzhimei.study.design.factory.abstractfactory;
/**
* www.itzhimei.com
* 苹果汁
*/
public class AppleJuice implements IFruitsJuice {
@Override
public String getFruitsJuice() {
return "苹果汁";
}
}
package com.itzhimei.study.design.factory.abstractfactory;
public interface IFruitsCookie {
/**
* 定义水果饼干方法
* @return
*/
String getFruitsCookie();
}
package com.itzhimei.study.design.factory.abstractfactory;
/**
* www.itzhimei.com
* 苹果饼干
*/
public class AppleCookie implements IFruitsCookie {
@Override
public String getFruitsCookie() {
return "苹果饼干";
}
}
4、测试
package com.itzhimei.study.design.factory.abstractfactory;
/**
* www.itzhimei.com
* 测试
*/
public class Client {
public static void main(String[] args) {
IAppleFactory af = new AppleFactory();
System.out.println(af.getFruitsJuice().getFruitsJuice());
System.out.println(af.getFruitsCookie().getFruitsCookie());
}
}
涉及的类:
类关系图:
总结:
学习了上面的内容和代码之后,抽象工厂其实从名字也能看出其特性,就是对工厂的抽象,也就对工厂类数量的简化,对单个工厂能力的提升,因为一个工厂中生产的产品变多了。