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


    模式名和分类

    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();
       }
    }
        
    

    相关模式

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

  • 相关阅读:
    HyperLogLog
    Bitmaps
    正向代理与反向代理的概念
    性能优化——应用服务器性能优化
    Memcached的优点
    前端基础之BOM和DOM
    性能优化——Web前端性能优化
    亡命逃窜---三维搜索
    Sum It Up -- 深搜 ---较难
    排序---对二维数组的排序
  • 原文地址:https://www.cnblogs.com/dhcao/p/11265692.html
Copyright © 2020-2023  润新知