抽象工厂模式
定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。上一节讲到简单工厂模式,那抽象工厂模式就是简单工厂的升级版。不止是简单工厂一个工厂,而是N个工厂。一个具体工厂会有个产品族。而每一个具体工厂创建属于同一个产品族,但是分属于不同等级结构的产品。
从图里可以看出简单工厂的身影,其实相当把多个简单工厂再进行管理。这次也是奶茶的例子,比如奶茶店扩大规模,要在各地方建设奶茶店,但是每个地方奶茶风格都不同。东部奶茶店有东部珍珠奶茶,西部奶茶店有西部珍珠奶茶。这时每个奶茶店需要独立出一个工厂。
代码示例
奶茶抽象工厂类,并且定义创建奶茶方法。
public interface MilkTeaFactory {
MilkTea createMilkTea(String type);
}
奶茶抽象类,用于定义规范。
public abstract class MilkTea {}
两个具体奶茶工厂类。根据传进的类型返回奶茶实例。
//西部奶茶工厂
public class WestMilkTeaFactory implements MilkTeaFactory{
public MilkTea createMilkTea(String type) {
MilkTea milkTea = null;
if (type.equals("珍珠奶茶")) {
milkTea = new WestPearlMilkTea();
} else if (type.equals("抹茶奶茶")) {
milkTea = new WestMatchalMilkTea();
}
return milkTea;
}
}
//东部奶茶工厂
public class EastMilkTeaFactory implements MilkTeaFactory{
public MilkTea createMilkTea(String type) {
MilkTea milkTea = null;
if (type.equals("珍珠奶茶")) {
milkTea = new EastPearlMilkTea();
} else if (type.equals("抹茶奶茶")) {
milkTea = new EastMatchalMilkTea();
}
return milkTea;
}
}
客户端
MilkTeaFactory factory = new EastMilkTeaFactory();
MilkTea milkTea = factory.createMilkTea("珍珠奶茶");//东部的珍珠奶茶
factory = new WestMilkTeaFactory();
milkTea = factory.createMilkTea("抹茶奶茶");//西部的抹茶奶茶
抽象工厂模式符合依赖倒置原则,依赖抽象而不依赖具体。如果西部奶茶换成东部奶茶,直接替换相应的子类。该模式缺点也非常明显,需要多个产品族才能发挥作用,也导致类膨胀。所以这模式并不常见。
工厂方法
除了简单工厂,抽象工厂模式。还有一种常见的方法,那就是工厂方法。工厂方法并不属于模式,只是一个方法。对外提供静态方法,作用是创建实例并且返回。通常实例不多都采取这种方式,类也不用扩充。
public static MilkTea createMilkTea(String type) {
MilkTea milkTea = null;
if (type.equals("珍珠奶茶")) {
milkTea = new PearlMilkTea();
} else if (type.equals("抹茶奶茶")) {
milkTea = new MatchalMilkTea();
}
return milkTea;
}
总述
总的来说,抽象工厂需要很多的产品族才能发挥作用,平时不常见也不常用。不足之处望指教。