概述
定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口
扩展:无须指定它们具体的类
类型:创建型
抽象工厂能够将一组具有同一主题和单独的工厂封装起来,在正常使用中,客户端程序创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体实现,我们不需要关心内部方法中获得对象的具体类型,
因为我们的客户端对象仅使用通用接口,抽象工厂模式将一组对象的实现细节和它们的使用分离开。
适用场景
客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码
提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现
优点
具体产品在应用层代码隔离,无须关心创建细节
将一个系列的产品族统一到一起创建
缺点
规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
增加了系统的抽象性和理解难度
抽象工厂 – 产品等级结构与产品族
相同颜色的代表同一产品登记
相同形状 不同颜色的是一个产品族
比如说华为生产基站,还生产手机,还生产芯片,华为生产的产品都是属于华为的品牌,属于同一产品等级
竖着来看 手机是方框形的 这个竖着的还有小米等手机品牌 这是同一产品组
向上箭头的是 一个个具体工厂
演示
CakeFactory接口
package softwareDesign.coding.factoryMethod.abstractFactory;
public interface CakeFactory {
Cake getCake();
GiftBox getGiftBox();
}
Cake抽象类
package softwareDesign.coding.factoryMethod.abstractFactory;
public abstract class Cake {
public abstract void produce();
}
GiftBox 抽象类
package softwareDesign.coding.factoryMethod.abstractFactory;
public abstract class GiftBox {
public abstract void produce();
}
SnowCake类
package softwareDesign.coding.factoryMethod.abstractFactory;
public class SnowCake extends Cake{
@Override
public void produce() {
System.out.println("生产雪花蛋糕...");
}
}
SnowCakeGiftBox 类
package softwareDesign.coding.factoryMethod.abstractFactory;
public class SnowCakeGiftBox extends GiftBox{
@Override
public void produce() {
System.out.println("生产雪花蛋糕礼盒...");
}
}
SnowCakeFactory 类
package softwareDesign.coding.factoryMethod.abstractFactory;
public class SnowCakeFactory implements CakeFactory{
@Override
public Cake getCake() {
return new SnowCake();
}
@Override
public GiftBox getGiftBox() {
return new SnowCakeGiftBox();
}
}
CCake类
package softwareDesign.coding.factoryMethod.abstractFactory;
public class CCake extends Cake{
@Override
public void produce() {
System.out.println("生产巧克力蛋糕...");
}
}
CCakeGiftBox类
package softwareDesign.coding.factoryMethod.abstractFactory;
public class CCakeGiftBox extends GiftBox{
@Override
public void produce() {
System.out.println("生产巧克力蛋糕礼盒");
}
}
CCakeFactory 类
package softwareDesign.coding.factoryMethod.abstractFactory;
public class CCakeFactory implements CakeFactory {
@Override
public Cake getCake() {
return new CCake();
}
@Override
public GiftBox getGiftBox() {
return new CCakeGiftBox();
}
}
Test类
package softwareDesign.coding.factoryMethod.abstractFactory;
public class Test {
public static void main(String[] args) {
CakeFactory cakeFactory = new SnowCakeFactory();
Cake cake = cakeFactory.getCake();
GiftBox giftBox = cakeFactory.getGiftBox();
cake.produce();
giftBox.produce();
}
}
我们看一下它的类图:
从CakeFactory类开始看
如果增加水果蛋糕和水果蛋糕礼盒 很容易能够拓展
加入test测试:
Test只关心从哪个工厂拿什么产品。应用层和具体的雪花蛋糕类及其礼盒等都是解耦的。
缺点也很明显,如果要拓展产品等级,那就违背了开闭原则,牵一发而动全身。