定义:为创建一组相关或者相互依赖的对象提供一组接口,而无需指定它们的具体类;
工厂的最终定义是:客户提出需求,工厂满足需求,客户不需要知道你到底是怎么是实现的,给结果就行;
工厂方法模式在一般情况下只是会产生一个factory,因为在他的范畴内,产品类基本上只会出现一种差异(或者说是方法,特性差异并不多),东南亚分为:Malaysia,Thailand,Singepore;但是其中并没有考虑到其中各个国家内部之间还有差异;比如Malaysia;内部语言可能会有马语,和英语,在工厂方法模式中并不能很好的做出处理;那么抽象工厂模式就能够对他做出处理;
以上面国家为例写个demo:
A:抽象的产品类:
public interface Country { public String countryName(); }
public abstract class AbstractCountry implements Country { public abstract void useLanguage(); }
B:以马来西亚为例:
(1)使用英语的马来西亚人:
public class MalaysiaInEnglish extends AbstractCountry { @Override public void useLanguage() { System.out.println("use english!"); } @Override public String countryName() { return "Malaysia"; } }
(2)使用马来语的马来西亚人:
public class MalaysiaInMaYu extends AbstractCountry { @Override public void useLanguage() { System.out.println("use Mayu!"); } @Override public String countryName() { return "Malaysia"; } }
C:抽象的创造类,用于创造对象:
public abstract class AbstractCreator { public abstract AbstractCountry createMalaysia(); }
(1)生产说英语的马来西亚
public class EnglishMalaysiaCreator extends AbstractCreator { @Override public AbstractCountry createMalaysia() { return new MalaysiaInEnglish(); } }
(2)生产说马语的马来西亚
public class MayuMalaysiaCreator extends AbstractCreator { @Override public AbstractCountry createMalaysia() { return new MalaysiaInMaYu(); } }
D:实现测试:
public class PatternRealize { public static void main(String[] args) { AbstractCreator c1= new EnglishMalaysiaCreator(); AbstractCreator c2 = new MayuMalaysiaCreator(); MalaysiaInEnglish english = (MalaysiaInEnglish) c1.createMalaysia(); MalaysiaInMaYu mayu = (MalaysiaInMaYu) c2.createMalaysia(); } }
以上就是抽象工厂模式的实现;
优点:
封装性:只需要提需求,怎么出现的不管;
产品族内的约束为非公开状态:比如人的说英语和马语的人数分配;不公开,内部自己就定义好了;(其实也是因为封装的缘故);
缺点:
抽象类比较多,当增加产品族的时候,需要多一个create;而且要改抽象接口里面的代码不太符合设计模式中的开闭原则;