zoukankan      html  css  js  c++  java
  • GOF设计模式——Factory Method模式

    一、什么是Factory Method模式

            Factory Method模式是用来构建生成实例的工厂,在该模式下,父类决定实例生成的方式,但并不决定所要生成的具体类。这样的设计思想,就跟Template Method模式相似(具体参考:https://www.cnblogs.com/SysoCjs/p/10327088.html或者https://blog.csdn.net/weixin_39400271/article/details/86565016),因为Factory Method模式就是建立在Template Method模式的基础上,前者是决定实例的生成方式,而后者则是决定方法的执行流程。

    二、Factory Method模式思想

    Product:一个抽象类,属于框架的一部分。里面定义了在Factory Method模式下生成的实现所拥有的接口(API);

    Creator:负责生成Product角色的抽象类,也是属于框架的一部分;

    ConcreteProduct:决定了具体的产品;

    ConcreteCreator:负责生成具体的产品类。

    三、具体例子

            假设要设计一个IDCard的工厂类,用来“制造”很多很多的IDCard。

    1、Factory类

    package com.cjs.factoryMethod;
     
    public abstract class Factory {
        public final Product create(String owner) {
            Product product = createProduct(owner);
            registerProduct(product);
            return product;
        }
     
    //Factory类只知道下面两个方法的作用,至于它们是怎么做的,Factory类不知道,也不关心,具体实现交给相应的子类
        protected abstract Product createProduct(String owner);//调用此方法,生成产品(类对象)
     
        protected abstract void registerProduct(Product product);//调用此方法,注册产品(类对象)
    }

    Factory抽象类定义了两个抽象方法:createProduct和registerProduct,分别用于创建产品和注册产品;另外,还定义了一个final修饰的方法,里面设定了一些处理流程,这也就是Template Method模式的设计思想。

    2、Product类

    package com.cjs.factoryMethod;
     
    public abstract class Product {
        public abstract void use();
    }

    3、IDCardFactory类

    package com.cjs.factoryMethod;
     
    import java.util.*;
     
    public class IDCardFactory extends Factory {
        private List owners = new ArrayList();
        @Override
        protected Product createProduct(String owner) {
            return new IDCard(owner);
        }
     
        @Override
        protected void registerProduct(Product product) {
            owners.add(((IDCard)product).getOwner());
        }
    }

    继承了Factory抽象类,实现了createProduct方法和registerProduct方法,换句话说,只要继承了Factory类,就具有“工厂”的制造功能。

    4、IDCard类

    package com.cjs.factoryMethod;
     
    public class IDCard extends Product {
        private String owner;
     
        public IDCard(String owner) {
            System.out.println("制作 " + owner + " 的ID卡");
            this.owner = owner;
        }
     
        @Override
        public void use() {
            System.out.println("使用 " + owner + " 的ID卡");
        }
     
        public String getOwner() {
            return owner;
        }
    }

    5、Main类

    package com.cjs.factoryMethod;
     
    public class Main {
        public static void main(String[] args) {
            Factory factory = new IDCardFactory();
            IDCard idCard1 = (IDCard) factory.create("张三");
            IDCard idCard2 = (IDCard) factory.create("李四");
            IDCard idCard3 = (IDCard) factory.create("王五");
            idCard1.use();
            idCard2.use();
            idCard3.use();
        }
    }

    输出信息:

     

    四、Factory Method模式的优点

            如果现在有一个新需求,要给每一个人制做一个工牌,那么,只要编写一个EmployeeCardFactory类,继承Factory类,并实现两个抽象方法,那么EmployeeCardFactory类就具有“工厂”的功能。请注意,这里并没有修改任何关于模板框架的内容,就可以创建出其他的“工厂”和“产品”。

  • 相关阅读:
    leetcode Power of Two
    leetcode Merge Two Sorted Lists
    Mac linux 安装memcached服务 用法
    Vsftp配置都没有问题 连接不上 530 Login incorrect 解决方法
    mysql 远程连接不上 %用户已经添加了
    Centos yum 安装mysql报错 No package mysql-server available.
    Linux 查询程序安装路径 是否安装
    php报错 Call to undefined function mb_stripos()
    mac编译openssl扩展报错 openssl.c:44:10: fatal error: 'openssl/evp.h' file not found
    在安装mysqli的时候,出现error: ext/mysqlnd/mysql_float_to_double.h: No such file or direc
  • 原文地址:https://www.cnblogs.com/SysoCjs/p/10327165.html
Copyright © 2011-2022 走看看