GOF 工厂模式

GOF 创建型模式 系列文章

  1. 单例模式
  2. 工厂模式
  3. 抽象工厂模式
  4. 建造者模式
  5. 原型模式


参考资料

  1. 尚学堂_简单工厂模式
  2. 尚学堂_工厂方法模式
  3. 菜鸟教程_工厂方法模式

1. 概述

  • 面向对象设计的基本原则

    • OCP (开闭原则, Open-Closed Principle) :一个软件的实体应当对扩展开
      放,对修改关闭。
    • DIP (依赖倒转原则, Dependence Inversion Principle ) :要针对接口编程,
      不要针对实现编程。
    • LoD (迪米特法则, Law of Demeter ) :只与你直接的朋友通信,而避免和
      陌生人通信。
  • 作用:实现了 创建者调用者 的分离

  • 核心本质

    • 实例化对象,用工厂方法代替new操作
    • 将选择实现类、创建对象统一管理和控制。从而将调用者和实现类解耦。
  • 分类和使用场景

    • 简单工厂模式(静态工厂)
      • 用来生产同一等级结构中的 任意 产品。(对于增加新的产品,需要修改已有代码)
    • 工厂方法模式
      • 用来生产同一等级结构中的 固定 产品。(支持增加任意产品)
    • 抽象工厂模式
      • 用来生产不同产品族的 全部 产品。(对于增加新的产品,无能为力;支持增加产品族)

2. 简单工厂模式

  • 简单工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。

    • 可以用if···else if···else对传入的参数进行判断
    • 也可以根据不同的类写不同的创建方法
  • 对于增加新产品无能为力!!!不修改代码的话,是无法扩展的。

  • 形状类接口及其实现类

    public interface Shape {
       void draw();
    }
    public class Rectangle implements Shape {
       @Override
       public void draw() { System.out.println("Inside Rectangle::draw() method."); }
    }
    public class Circle implements Shape {
       @Override
       public void draw() { System.out.println("Inside Circle::draw() method."); }
    }
    
  • 简单工厂

    • 实现方法一:用if···else if···else对传入的参数进行判断来返回不同的对象实例
      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(); } 
            return null;
         }
      }
      
    • 实现方法二:根据不同的类写不同的创建方法来返回不同的对象实例
      public class ShapeFactory {
         public Shape getRectangle(){ return new Rectangle(); }
         public Shape getCircle(){ return new Circle(); }
      }
      

3. 工厂方法模式

  • 避免简单工厂模式的缺点:不完全满足 OCP开闭原则。

  • 工厂模式和简单工厂模式 最大的不同 在于:

    • 简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类
    • 工厂方法模式有一组实现了相同接口的工厂类。
  • 优点:

    1、一个调用者想创建一个对象,只要知道其名称就可以了。
    2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
    3、屏蔽产品的具体实现,调用者只关心产品的接口。

  • 缺点:

    每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

  • 工厂方法模式实现

    /* ShapeFactory接口文件 */
    public interface ShapeFactory {
    	public Shape getShape();
    }
    /* RectangleFactory.java文件  */
    public class RectangleFactory implements ShapeFactory {
    	@Override
    	public Shape getShape(){ return new Rectangle(); }
    }
    /* CircleFactory.java文件  */
    public class CircleFactory implements ShapeFactory {
    	@Override
    	public Shape getShape(){ return new Circle(); }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值