设计模式--1.0.2

工厂模式

Version 1.0.2

工厂模式提供一种创建对象的方式,而无需指定要创建的具体类。

通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和扩展性。

意图

定义一个创建对象的接口,让其子类决定实例化哪一个具体的类。工厂模式使对象的创建过程延迟到子类。

主要解决问题

接口选择的问题

关键代码

对象的创建过程在子类中实现

实例

  1. 汽车制造:你需要汽车,只需要从工厂中提货,而不需要关心汽车的制造过程及其内部实现

  2. Hibernate:更新数据库时,只需要更改方言和数据库驱动,即可实现对不同数据库的切换

优点

  1. 调用者只需要知道对象的名称即可创建对象

  2. 扩展性高,如果需要增加新产品,只需要扩展一个工厂类

  3. 屏幕了产品的具体实现,调用者只关心产品的接口

缺点

每次增加一个产品时,需要增加一个具体类和对应的工厂,使系统中类的数量成倍增加,增加系统的复杂性和具体类的依赖

使用场景

  1. 日志记录:日志可能记录到本地硬盘,系统事件,远程服务器等,用户可以选择记录日志的位置

  2. 数据库访问:当用户不知道最终系统使用哪种数据库,或者数据库可能变化时

  3. 连接服务器的框架设计:需要支持“POP3”,"IMAP","HTTP"三种协议,可以将这三种协议做为产品类,共同实现一个接口

注意事项

工厂模式适用于生成复杂对象的场景。如果对象较为简单,通过new即可创建,则不必使用工厂模式。使用工厂模式会引入一个工厂类,增加系统复杂度

实现

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

FactoryPatternDemo类使用ShapeFactory来获取Shape对象。它将向ShapeFactory传递消息,以便获取它所需对象的类型

// 创建一个接口Shape.java

public interface Shape{
  void draw();
}

创建实现接口的实体类

// Rectangle.java

public class Rectangle implements Shape{
  
  @Override
  public void draw(){
    System.out.println("Inside Rectangle::draw() method.");
  }
}
// Square.java
public class Square implements Shape{

  @Override
  public void draw(){
    System.out.println("Inside Square::draw() method.");
  }
}
// Circle.java

public class Circle implements Square{
  
  @Override
  public void draw(){
    System.out.println("Inside Circle::draw() method.");
  }
}

创建一个工厂,生成基于给定消息的实体类的对象

// ShapeFactory.java
public class ShapeFactory{

// 使用getShape方法获取形状类型的对象
  public Shape getShape(String shapeType){
    if(shapeType == null){
      return null;
    }
    if(shapeType.equalsIgnoreCase("CIRCLE")){
      return new Circle();
    }else if(shapeType.equalsIgnoreCase("RECTANGLE")){
      return new Rectangle();
    }else if(shapeType.equalsIgnoreCase("SQUARE")){
      return new Square();
    }
    return null;
  }
}

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

// FactoryPatternDemo.java
public class FactoryPatternDemo{
  public static void main(String[] args){
    ShapeFactory shapeFactory = new ShapeFactory();

    // 获取Circle的对象,并调用它的draw()方法
    Shape shape1 = shapeFactory.getShape("CIRCLE");
    // 调用Circled的draw()方法
    shape1.draw();

    // 获取Circle的对象,并调用它的draw()方法
    Shape shape2 = shapeFactory.getShape("RECTANGLE");
    // 调用Circled的draw()方法
    shape2.draw();

    // 获取Circle的对象,并调用它的draw()方法
    Shape shape3 = shapeFactory.getShape("SQUARE");
    // 调用Circled的draw()方法
    shape3.draw();
  }
}

posted on 2024-06-11 21:38  强K  阅读(2)  评论(0编辑  收藏  举报