一、定义
抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
二、优点及缺点
优点:
1、当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:
2、产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
三、代码实现:
水果抽象类:
/** * @author: wsq * @Date: 2020/9/18 14:38 * @Description: 水果接口 */ public interface Fruit { public void printName(); }
水果的两个实现类:
public class Apple implements Fruit { @Override public void printName() { System.out.println("This is apple!!!"); } } public class Banana implements Fruit { @Override public void printName() { System.out.println("This is banana!!!"); } }
图形抽象类:
/** * @author: wsq * @Date: 2020/9/21 19:17 * @Description: 图形抽象类 */ public interface Shape { public void printShape(); }
图形的两个实现类:
public class Square implements Shape{ @Override public void printShape() { System.out.println("This is square!!!"); } } public class Circle implements Shape{ @Override public void printShape() { System.out.println("This is circle!!!"); } }
图形和水果的抽象工厂类:
/** * @author: wsq * @Date: 2020/9/18 15:00 * @Description: 抽象工厂 */ public abstract class AbstactFactory { public abstract Shape getShape(String name); public abstract Fruit getFruit(String name); }
图形和水果的工厂类:
/** * @author: wsq * @Date: 2020/9/21 19:19 * @Description: 水果的工厂 */ public class FruitFactory extends AbstactFactory{ @Override public Shape getShape(String name) { return null; } public Fruit getFruit(String name){ if(name.equals("apple")){ return new Apple(); } if(name.equals("banana")){ return new Banana(); } return null; } } /** * @author: wsq * @Date: 14:57 * @Description: 图形的工厂 */ public class ShapeFactory extends AbstactFactory{ public Shape getShape(String name){ if(name.equals("circle")){ return new Circle(); }else if(name.equals("square")){ return new Square(); } return null; } @Override public Fruit getFruit(String name) { return null; } }
工厂类:
/** * @author: wsq * @Date: 2020/9/21 19:20 * @Description: 工厂类 */ public class FactoryProducer { public AbstactFactory getFactory(String name){ if(name.equals("FruitFactory")){ return new FruitFactory(); }else if(name.equals("shapeFactory")){ return new ShapeFactory(); } return null; } }
四、源码级别
五、总结
使用场景:
1、一组数据,一换就换一套。
2、生成不同操作系统的程序。
注意事项:产品族难扩展,产品等级易扩展。