简述
- 简单工厂模式: 由一个具体的工厂实例类根据调用传入标识来判定创建产品抽象类的不同实例。
- 工厂方法模式: 多个工厂实例类继承实现同一个工厂抽象,工厂抽象类只有单一产品抽象, 调用时由调用方选择实例化指定的工厂实例类来创建不同的产品实例。
- 抽象工厂模式: 工厂模式的基础上增加另外的多个不同的产品抽象,工厂中含有多个不同产品抽象的实例方法。
简单工厂模式
又称静态工厂方法模式
- 工厂实例角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。
- 产品抽象角色:它一般是具体产品继承的父类或者实现的接口。
- 产品实例角色:工厂实例所创建的对象就是此角色的实例,由一个具体类实现。
public class SimpleNoodlesFactory { public static final int TYPE_LZ = 1;//兰州拉面 public static final int TYPE_PM = 2;//泡面 public static final int TYPE_GK = 3;//干扣面 public static INoodles createNoodles(int type) { switch (type) { case TYPE_LZ: return new LzNoodles(); case TYPE_PM: return new PaoNoodles(); case TYPE_GK: default: return new GankouNoodles(); } }}
工厂方法模式
工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的逻辑判断可以由工厂方法模式里不同的工厂子类来分担, 调用方调用时选择实例具体工厂。
- 一个产品抽象,可以派生出多个具体产品类。
- 一个工厂抽象,可以派生出多个具体工厂类。
- 每个具体工厂实例只能创建一个具体产品类的实例。
/*抽象工厂*/public abstract class NoodlesFactory { public abstract INoodles create();}
/*实例工厂A*/public class LzFactory extends NoodlesFactory { @Override public INoodles create() { return new LzNoodles(); }}/*实例工厂B*/public class PaoFactory extends NoodlesFactory { @Override public INoodles create() { return new PaoNoodles(); }}/*调用时指定实例化工厂对象*/ NoodlesFactory factory = new GankouFactory(); INoodles entity = factory .create(); entity .desc();
抽象工厂模式
- 多个产品抽象,每个产品抽象可以派生出多个产品抽象实例。
- 一个抽象工厂,可以派生出多个具体工厂实例。
- 每个具体工厂实例可以创建多个产品(簇)抽象的实例。
相同:
都只有一个工厂抽象。
区别:
- 工厂方法模式只有一个产品抽象,而抽象工厂模式有多个。
- 工厂方法模式的具体工厂实例类只能创建一个产品抽象的实例,而抽象工厂模式可以创建不同产品抽象的实例。
/*产品抽象*/public abstract class IDrinks { public abstract void prices();}/*产品实例*/public class ColaDrinks extends IDrinks { @Override public void prices() { System.out.println("可乐三块五"); }}/*产品实例*/public class WaterDrinks extends IDrinks { @Override public void prices() { System.out.println("和我一样的穷鬼都喝水,不要钱~!"); }}/*工厂抽象*/public abstract class AbstractFoodFactory { /** * 生产面条 * * @return */ public abstract INoodles createNoodles(); /** * 生产饮料 */ public abstract IDrinks createDrinks();}/*工厂实例*/public class LzlmFoodFactory extends AbstractFoodFactory { @Override public INoodles createNoodles() { return new LzNoodles();//卖兰州拉面 } @Override public IDrinks createDrinks() { return new WaterDrinks();//卖水 }}/*工厂实例*/public class KFCFoodFactory extends AbstractFoodFactory { @Override public INoodles createNoodles() { return new PaoNoodles();//KFC居然卖泡面 } @Override public IDrinks createDrinks() { return new ColaDrinks();//卖可乐 }} /*使用*/ AbstractFoodFactory abstractFoodFactory1 = new KFCFoodFactory(); abstractFoodFactory1.createDrinks().prices(); abstractFoodFactory1.createNoodles().desc(); abstractFoodFactory1= new LzlmFoodFactory(); abstractFoodFactory1.createDrinks().prices(); abstractFoodFactory1.createNoodles().desc();