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