工厂方法模式(工厂模式)

模式名和分类

Factory

意图

定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

备注1:工厂方法是一个类的实例化延迟到其子类。 指的是工厂接口的实现类。
备注2:工厂方法模式只是工厂模式的一个优化,很多时候不会特意将简单工厂区与工厂方法区分。或者区分为:工厂模式-工厂方法模式简单工厂模式-工厂模式

别名

FactoryMethod

动机

参照简单工厂模式:https://www.cnblogs.com/dhcao/p/11151858.html
该模式优化了简单工厂:

  • 在使用上虽然不比简单工厂更方便,但是在设计上,更符合开闭设计原则:对修改关闭,对新增开放
  • 在简单工厂中,我们在Factory中根据if-else或者case或者其他路由方式来选择创建何种实例,但是如果新增一个实例化产品,需要在工厂中新增路由判断,这样的写法,使得模式违背了开闭原则。

结构

参与者

  • 需要创建的产品模块 -- Shape、Circle、Square、Rectangle
  • 工厂模块 -- ShapeFactory、CircleFactory、SquareFactory、RectangleFactory
  • 调用客户端(未在图展示)

协作

可对比简单工厂模式来理解记忆:

  • 每个产品都有专有的工厂来创建,每个工厂创建专属的产品。
  • 具体使用哪个工厂,由客户端来决定。

代码实例

//步骤 1
//创建一个接口:
//Shape.java
public interface Shape {
   void draw();
}


//步骤 2
//创建实现接口的实体类。
//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 Shape {
 
   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}

//步骤 3
//创建一个工厂接口
//ShapeFactory.java
public class ShapeFactory {
    
   //使用 getShape 方法获取形状类型的对象
   public Shape getShape();
}

// 创建具体的工厂类
//CircleFactory.java
public class CircleFactory implements ShapeFactory{
    
   //使用 getShape 方法获取形状类型的对象
    public Shape getShape(){
        return new Circle();
    }
}

//SquareFactory.java
public class SquareFactory implements ShapeFactory{
    
   //使用 getShape 方法获取形状类型的对象
    public Shape getShape(){
        return new SquareFactory();
    }
}

//RectangleFactory.java
public class RectangleFactory implements ShapeFactory{
    
   //使用 getShape 方法获取形状类型的对象
    public Shape getShape(){
        return new RectangleFactory();
    }
}


// 步骤 4
// 客户端使用工厂。

//FactoryPatternDemo.java
public class FactoryPatternDemo {
 
   public static void main(String[] args) {
      ShapeFactory shapeFactory = new ShapeFactory();
 
      //通过Circle工厂获取 Circle 的对象,并调用它的 draw 方法
      ShapeFactory cFactory = new CircleFactory();
      Shape circle = cFactory.getShape();
 
      //调用 Circle 的 draw 方法
      circle.draw();
 
      //通过Square工厂获取 Square 的对象,并调用它的 draw 方法
      ShapeFactory sFactory = new SquareFactory();
      Shape square = sFactory.getShape();
 
      //调用 Square 的 draw 方法
      square.draw();
   }
}

相关模式

简单工厂模式、工厂模式、抽象工厂模式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TuringK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值