JAVA设计模式之简单工厂模式

目录

一、什么是简单工厂模式

二、简单工厂模式的结构

三、代码示例

四.总结分析


一、什么是简单工厂模式

简单工厂模式提供了按需创建对象的最佳方式,是创建型设计模式的一种;

简单工厂模式又称为静态工厂模式,实质是一个工厂类根据传入的参数,动态决定应该创建哪个具体实现类(这些类是继承自一个父类或接口)的一种设计模式。

二、简单工厂模式的结构

简单工厂模式通常由以下几个部分组成

1.Factort:工厂类,其中有能根据不同的请求创建具体产品类的方法;

2.Product:抽象产品类或接口,它是实例所共有的公共接口;

3.ConcreteProduct:具体产品类,通常是Product的具体实现;

UML图示例:

 如图所示:

工厂类是ShapeFactory;抽象产品类是Shape;具体产品类是Circle,Square,Rectangle等具体的形状类;

三、代码示例

步骤1:创建抽象产品类或接口Shape;

public interface Shape {
   /**
    * 定义一个画图的抽象方法
    */ 
   void draw();

}

步骤2:画图的具体实现类Square和Circle类,它们都实现Shape接口的方法;

Square类:

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

Circle类:

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

步骤3.创建工厂类ShapeFactory,里面有获取不同具体形状实现类的方法;以下示例代码里面有两种获取具体实例的方法,优缺点明显;

/**
 * @Description: 工厂类:可以避免在controller中逐个添加业务实现类
 * @Author: yangshilei
 */
public class ShapeFactory {
    
   // 方法1:使用 getShape 方法获取形状类型的对象,缺点就是每次新增一种都要修改此方法的逻辑;
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }        
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();
      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }
      return null;
   }

    // 方法2: 通过反射获取获取,当有新增实现类时候无需修改此方法的逻辑;
    public Shape getByClassName(Class<? extends Shape> clazz) throws IllegalAccessException, InstantiationException {
        if(Objects.isNull(clazz)) return null;
        return clazz.newInstance();
    }


}

步骤4:FactoryPatternDemo 调用工厂创建对象示例;

public class FactoryPatternDemo {
 
   public static void main(String[] args) {
      ShapeFactory shapeFactory = new ShapeFactory();
      //获取 Circle 的对象,并调用它的 draw 方法
      Shape shape1 = shapeFactory.getShape("CIRCLE");
      //调用 Circle 的 draw 方法
      shape1.draw(); 

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

四.总结分析

  • 优点:简单工厂模式,使用工厂对象创建具体的产品对象,从而使得对象的使用和创建过程进行的分离。调用方无需关注对象是谁创建的,只要通过工厂中静态方法就可以直接获取其需要的对象

  • 缺点:工厂类中需要选择创建具体某个对象,所以一旦添加新的实现类时候则必须要对工厂中的方法1选择逻辑进行修改,违背了开闭原则!

  • 适应场合:产品类相对较少的情况,使用简单工厂创建产品对象,这样即实现了生产者与消费者的分离,也不会在工厂类中出现太复杂的判断逻辑!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值