抽象工厂模式(Abstract Factory Pattern):提供一个建立一系列相关或相互依赖对象的接口,而
无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象建立型模式。git
在抽象工厂模式中,每个具体工厂都提供了多个工厂方法用于产生多种不一样类型的产品,这些产品构成了一个产品族,抽象工厂模式结构如图所示:设计模式
同一个品牌的这边给他算一个产品族,冰箱,电视算两个产品等级结构,一个具体的工厂实现类能够产生同一个品牌的不一样的产品。
产品1接口ide
public interface Fridge { void freeze(); }
产品1实现类1测试
public class HaierFridge implements Fridge { @Override public void freeze() { System.out.println("海尔冰箱冰冻啦"); } }
产品2实现类2设计
public class MediaFridge implements Fridge { @Override public void freeze() { System.out.println("美的冰箱冰冻啦"); } }
产品2接口code
public interface Tv { void watch(); }
产品2实现类1对象
public class HaierTv implements Tv { @Override public void watch() { System.out.println("看海尔电视啦"); } }
产品2实现类2blog
public class MediaTv implements Tv { @Override public void watch() { System.out.println("看美的电视啦"); } }
工厂接口接口
public interface Factory { Tv getTv(); Fridge getFridge(); }
工厂实现类1
public class HaierFactory implements Factory { @Override public Tv getTv() { return new HaierTv(); } @Override public Fridge getFridge() { return new HaierFridge(); } }
工厂实现类2
public class MediaFactory implements Factory { @Override public Tv getTv() { return new MediaTv(); } @Override public Fridge getFridge() { return new MediaFridge(); } }
测试
public class Test { public static void main(String[] args) { //能够从配置文件中得到具体类名,经过反射得到相应的工厂类来实现其配置化 Factory factory1=new HaierFactory(); factory1.getTv().watch(); factory1.getFridge().freeze(); Factory factory2=new MediaFactory(); factory2.getTv().watch(); factory2.getFridge().freeze(); } } //看海尔电视啦 //海尔冰箱冰冻啦 //看美的电视啦 //美的冰箱冰冻啦
在抽象工厂模式中,增长新的产品族很方便(如添加一个牌子的产品族),可是增长新的产品等级结构(添加洗衣机这个新的产品登记结构)很麻烦,抽象工厂模式的这种性质称为“开闭原则”的倾斜性。“开闭原则”要求系统对扩展开放,对修改封闭,经过扩展达到加强其功能的目的,对于涉及到多个产品族与多个产品等级结构的系统,其功能加强包括两方面:
将具备共同约束的多个产品放在一个族里,工厂类中能够产生多个属于同一个产品族的产品,相比于工厂方法的每一个产品一个工厂类来讲可大量减小类的数量。缺点就是不可扩展其余产品种类。