当前位置:   article > 正文

设计模式:工厂方法模式

设计模式:工厂方法模式

工厂模式属于创建型模式,也被称为多态工厂模式,它在创建对象时提供了一种封装机制,将实际创建对象的代码与使用代码分离,有子类决定要实例化的产品是哪一个,把产品的实例化推迟到子类。

使用场景

  • 重复代码 : 创建对象 需要使用 大量重复的代码 ;
  • 不关心创建过程 : 客户端 不依赖 产品类 , 不关心 实例 如何被创建 , 实现等细节 ;
  • 创建对象 : 一个类 通过其 子类 来 指定 创建哪个对象 ;

 工厂方法模式的角色

  • 抽象产品(Product)是定义产品的接口,是工厂方法模式创建对象的父类,也就是产品对象的公共父类。
  • 产品类(ConcreteProduct)是实现了抽象产品所声明的接口,工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。
  • 抽象工厂(Factory)是工厂方法模式的核心,所有创建对象的工厂类都必须继承该接口。
  • 具体工厂(ConcreteFactory)是抽象工厂的子类,实现了抽象工厂中定义的函数,工厂方法模式所创建的每一个对象都是某个具体产品类的实例。

结构图 

优缺点

优点

  • 不关心创建细节 : 用户 只需要 关心 所需产品 对应的工厂 , 无需关心创建细节 ;
  • 符合开闭原则 : 加入 新产品 , 符合开闭原则 , 提高可扩展性 ;

缺点

  • 增加复杂性:类的个数容易过多,增加系统复杂度;在添加新产品时,除了编写 新的产品类之外 ,还要 编写该产品类对应的工厂类。
  • 增加难度:增加了系统抽象性和理解难度。工厂方法本身利用了抽象,该模式中会 引入抽象层 ,如果要动态创建产品类,还要 引入反射技术。

应用实例 

创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory

FactoryPatternDemo 类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。

抽象产品

  1. public interface Shape {
  2. void draw();
  3. }

 实现接口的产品类

  1. public class Rectangle implements Shape {
  2. @Override
  3. public void draw() {
  4. System.out.println("Inside Rectangle::draw() method.");
  5. }
  6. }
  7. public class Square implements Shape {
  8. @Override
  9. public void draw() {
  10. System.out.println("Inside Square::draw() method.");
  11. }
  12. }
  13. public class Circle implements Shape {
  14. @Override
  15. public void draw() {
  16. System.out.println("Inside Circle::draw() method.");
  17. }
  18. }

抽象工厂

  1. public interface Factory {
  2. public Shape getShape(String shapeType);
  3. }

具体工厂

  1. public class ShapeFactory implements Factory {
  2. //使用 getShape 方法获取形状类型的对象
  3. @Override
  4. public Shape getShape(String shapeType){
  5. if(shapeType == null){
  6. return null;
  7. }
  8. if(shapeType.equalsIgnoreCase("CIRCLE")){
  9. return new Circle();
  10. } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
  11. return new Rectangle();
  12. } else if(shapeType.equalsIgnoreCase("SQUARE")){
  13. return new Square();
  14. }
  15. return null;
  16. }
  17. }

使用该工厂,通过传递类型信息来获取实体类的对象

  1. public class FactoryPatternDemo {
  2. public static void main(String[] args) {
  3. ShapeFactory shapeFactory = new ShapeFactory();
  4. //获取 Circle 的对象,并调用它的 draw 方法
  5. Shape shape1 = shapeFactory.getShape("CIRCLE");
  6. //调用 Circle 的 draw 方法
  7. shape1.draw();
  8. //获取 Rectangle 的对象,并调用它的 draw 方法
  9. Shape shape2 = shapeFactory.getShape("RECTANGLE");
  10. //调用 Rectangle 的 draw 方法
  11. shape2.draw();
  12. //获取 Square 的对象,并调用它的 draw 方法
  13. Shape shape3 = shapeFactory.getShape("SQUARE");
  14. //调用 Square 的 draw 方法
  15. shape3.draw();
  16. }
  17. }

运行结果

  1. Inside Circle::draw() method.
  2. Inside Rectangle::draw() method.
  3. Inside Square::draw() method.

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/45252
推荐阅读
相关标签
  

闽ICP备14008679号