定义:
抽象工厂模式(Abstract Factory Pattern): 提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们(创建的类)具体的类。
静态类图:
实例:(北方程序员吃早餐:吃+喝)
public interface Food{
// 吃:产品类
private String name;
public void yeRen();
}
public interface Drink{
//喝: 产品类
private String name;
public void qiangRen();
}
public class Baozi implements Food{
//包子
private String name;
public void yeRen{
System.out.println("包子噎人");
}
}
public class YouTiao implements Food{
//油条 ----食物产品类中的一类具体产品
private String name;
public void yeRen{
System.out.println("油条噎人");
}
}
public DouJiang implements Drink{
//豆浆 ----早餐产品族中饮料产品类中某个具体产品
private String name;
public void qiangRen{
System.out.print("豆浆呛人");
}
}
public BaiMiZhou implements Drink{
//白米粥 ---早餐产品族中饮料产品类中某个具体产品
private String name;
public void qiangRen{
System.out.println("白米粥呛人");
}
}
public abstract class IZaoCanDian{
//抽象工厂类 --负责定义产品族包含的抽象产品
public Food productFood();
public Drink productDrink();
}
public class BaoZiPu extends IZaoCanDianFactory{
//具体工厂 早餐组合: 包子+白米粥
@Override
public BaoZi productFood(){
return new BaoZi();
}
@Override
public BaiMiZhou productDrink(){
return new BaiMiZhou();
}
}
public class YouTiaoDian extends IZaoCanDianFactory{
//具体工厂 早餐组合: 油条 + 豆浆
@Override
public YouTiao productFood(){
return new YouTiao();
}
@Override
public DouJiang productDrink(){
return new DouJiang();
}
}
public class BeiFangChengXuYuan{
// Client 端
public static void main(String args[]){
String jinRiZaoCanDianClass = "com.tj.cs.pattern.abstractFactory.BaoZiPu";
IZaoCanDian zaoCanDian = Class.forName(jinRiZaoCanDianClass);
Food chi = zaoCanDian.productFood(); //包子铺生产的包子
Drink he = zaoCanDian.productDrink(); //包子铺生产的白米粥
}
}
后记
当有一天,北方新开业了一家早餐店(卖的包子、豆浆),北方程序员要去吃。只需要扩展新的店铺并生产对包子和豆浆。只需要把新开业的早餐店地址告诉他,就可以吃到新的早餐组合了。
忽然有一天,北方程序员升值加薪了,觉得早餐只吃饭喝饮料,满足不了自己膨胀起来的肚皮了,想配个水果,傲娇的北方程序员告诉自己如果哪家早餐不卖水果,一定不会去吃。因此抽象早餐店和所有的早餐店都需要提供生产水果的接口!随着北方程序员的不断升值加薪,系统都要大改一次。emm...
因此抽象工厂模式适用于产品族比较稳定的情况(早餐只有面食和饮料)!!