zoukankan      html  css  js  c++  java
  • 工厂方法模式

    一、模式名

    工厂方法, Factory Method

    二、解决的问题

    工厂方法,顾名思义,就是类似于工厂的方法,而工厂具有什么特点呢?我们都知道工厂可以批量生产某类商品,而设计模式正是借用了这个特点。工厂方法模式可以用于统一生成某类对象。将对象的生成统一到工厂方法中,当新增某类对象时,可以增加新对象类和对应的工厂类即可实现扩展,提高了程序的可扩展性。

    三、解决方案

    工厂方法分为简单工厂方法和工厂方法。

    1. 简单工厂方法

    简单工厂方法的UML图如下所示。

    clipboard

    代码如下

    interface Product {
        void method1();
    }
    
    class ProductA implements Product {
        @Override
        public void method1() {
            System.out.println("ProductA");
        }
    }
    
    class ProductB implements Product {
        @Override
        public void method1() {
            System.out.println("ProductB");
        }
    }
    
    class ProductFactory {
        Product createProduct(int type) {
            if (type == 1) {
                return new ProductA();
            } else if (type == 2) {
                return new ProductB();
            }
    
            return null;
        }
    }
    
    public class Client {
        public static void main(String[] args) {
            ProductFactory productFactory = new ProductFactory();
            Product productA = productFactory.createProduct(1);
            productA.method1();
    
            Product productB = productFactory.createProduct(2);
            productB.method1();
        }
    }

    可以看到,定义一个Product接口,再分别定义两个实现类ProductA和ProductB实现该接口。最后定义一个工厂,里面创建一个对象生成方法,用于根据输入参数生成对应的对象。

    简单工厂方法的优点是将所有对象的生成都放到了工厂方法中,易于管理和获取对象。缺点是每增加一个新的实现类时,除了添加一个实现类外,还需要修改工厂方法,这样不符合"对扩展开放,对修改关闭"的设计原则。所以提出了工厂方法,工厂方法增加一个工厂接口,每个具体的产品实现类都需要定义其对应的工厂类,用于对应对象的生成,这样每增加一个产品实现类时,只需要新增两个类,不需要修改原有代码。

    2. 工厂方法

    工厂方法的UML图如下所示。

    clipboard

    代码如下

    interface Product {
        void method1();
    }
    
    
    interface ProductFactory {
        Product createProduct();
    }
    
    
    class ProductA implements Product {
        @Override
        public void method1() {
            System.out.println("ProductA");
        }
    }
    
    
    class ProductAFactoryA implements ProductFactory {
        @Override
        public Product createProduct() {
            return new ProductA();
        }
    }
    
    
    class ProductB implements Product {
        @Override
        public void method1() {
            System.out.println("ProductB");
        }
    }
    
    
    class ProductAFactoryB implements ProductFactory {
        @Override
        public Product createProduct() {
            return new ProductB();
        }
    }
    
    
    public class FactoryMethodClient {
        public static void main(String[] args) {
            ProductAFactory productAFactoryA = new ProductAFactoryA();
            Product productA = productAFactoryA.createProduct();
            productA.method1();
    
            ProductAFactory productAFactoryB = new ProductAFactoryB();
            Product productB = productAFactoryB.createProduct();
            productB.method1();
        }
    }

    可以看到,每个产品具体类都对应一个工厂类,用于生成对应的产品类对象。以后需要新增产品类时,只需要新增产品类和对应的工厂类即可,不需要修改原有代码。

  • 相关阅读:
    linux redis安装 5.0.2
    Linux nginx安装步骤 centos7
    fastjson JSONObject.toJSONString 出现 $ref: "$."的解决办法(重复引用)
    docker redis安装及配置(外网访问 关闭安全限制 设置密码)
    JDK dump
    mysql8 修改root密码
    docker系列详解<二>之常用命令
    获取地理位置
    js调用摄像头
    点击时扩散效果
  • 原文地址:https://www.cnblogs.com/glsy/p/11062201.html
Copyright © 2011-2022 走看看