抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式定义:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
其实和策略模式还是蛮像的,只不过现在抽象分离出去的不是一个普通类,而是一个工厂类,并且工厂类依赖于多个抽象类(比如:酱料和火腿)
public class Store { private AbstractSourceFactory factory; public Store(AbstractSourceFactory factory){ this.factory = factory; } public void getSource(){ factory.sendSauce(); factory.sendHam(); } }
public abstract class AbstractSourceFactory { public abstract Sauce sendSauce(); public abstract Ham sendHam(); }
public class NYSourceFactory extends AbstractSourceFactory { public Sauce sendSauce() { return new TomatoSauce(); } public Ham sendHam() { return new OriginalHam(); } }
public class CHSourceFactory extends AbstractSourceFactory { public Sauce sendSauce() { return new StrawBerrySauce(); } public Ham sendHam() { return new BakeHam(); } }
public class Ham { protected String des; protected String getDes(){ return this.des; } }
public class OriginalHam extends Ham { public OriginalHam(){ System.out.println("OriginalHam"); } }
public class BakeHam extends Ham { public BakeHam(){ System.out.println("BakeHam"); } }
public class Sauce { protected String des; protected String getDes(){ return this.des; } }
public class StrawBerrySauce extends Sauce { public StrawBerrySauce(){ System.out.println("StrawBerrySauce"); } }
public class TomatoSauce extends Sauce { public TomatoSauce(){ System.out.println("TomatoSauce"); } }
ps:
缺点比较明显,当工厂方法中需要加上一类抽象或者移除一类抽象的时候(比如移除Hum),需要修改所有的具体工厂
但是考虑到抽象工厂方法通常用来创建一个产品家族(原料),比如,制作眼镜的原料一般是固定的(google眼镜除外),除非有创新,否则常年不会变,这时候使用抽象工厂方法就没有上面的扩展性问题,一定范围内不会变的东西不需要太考虑其扩展性