软件设计模式-创建型模式之工厂进阶版

红烧土豆泥
• 阅读 1324

简介: 所谓工厂模式,创建一个对象的接口,让子类决定实例化哪一个工厂类,使其创建过程延迟到了子类。 所谓的万能工厂类,通过反射调用的方式,获取到子类对象,并实例化返回,此外本案例还通过重载的方式,允许了有参和无参两种获取到实例的方式。

  /**
 * @author: demo
 * @date: 2021/8/7
 * @describe:
 */
public class MyFactory {
    /**
     * 构造器私有化
     */
    private MyFactory() {
    }

    /**
     * 获得实例
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getInstance(Class<T> clazz) {
        T instance = null;
        try {
            instance = clazz.getDeclaredConstructor().newInstance();
        } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
            e.printStackTrace();
        }
        return instance;
    }

    /**
     * 重载,获得实例
     * @param clazz
     * @param obj
     * @param <T>
     * @return
     */
    public static <T> T getInstance(Class<T> clazz, Object... obj) {
        T instance = null;
        Class[] c = new Class[obj.length];
        Object[] o = new Object[obj.length];
        try {
            for (int i = 0; i < obj.length; i++) {
                c[i] = getType(obj[i]);
                o[i] = obj[i];
            }
            instance = clazz.getDeclaredConstructor(c).newInstance(o);
        } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException | NullPointerException e) {
            e.printStackTrace();
        }
        return instance;
    }

    /**
     * 防止集合的匿名内部类赋值返回直接父类的class对象,造成找不到对应方法异常
     * @param obj
     * @return
     */
    private static Class getType(Object obj) {
        if (obj instanceof Map) {
            return Map.class;
        } else if (obj instanceof List) {
            return List.class;
        } else if (obj instanceof Set) {
            return Set.class;
        } else {
            return obj.getClass();
        }
    }
}

测试代码:

  /**
 * 使用了Lombok插件快速生成代码
 * @author: demo
 * @date: 2021/8/7
 * @describe:
 */
@Data
public class Person {
    private String name;
    private Map<String, List> map;

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    public Person(String name, Map<String, List> map) {
        this.name = name;
        this.map = map;
    }

    public static void main(String[] args) {
        Person person = MyFactory.getInstance(Person.class, "a", new HashMap<String, List>() {
            {
                put("a", new ArrayList() {
                    {
                        add("aaaaa");
                    }
                });
            }
        });
        System.out.println(person.toString());
    }
}

测试结果: 软件设计模式-创建型模式之工厂进阶版

但是,利用反射进行传参进行有参构造的实例化固好,但有一个无法避免的问题,即无法在编译期间发现参数类型是否与构造方法的类型相匹配。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
zdd小小菜鸟 zdd小小菜鸟
1年前
创建型-工厂模式 ( Factory Pattern )
创建型工厂模式(FactoryPattern)tex工厂模式(FactoryPattern)提供了一种创建对象的最佳方式工厂模式在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象工厂
Wesley13 Wesley13
2年前
Unity C# 设计模式(二)简单工厂模式
定义:简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactoryMethod)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该
Easter79 Easter79
2年前
Spring实例化Bean的三种方法
实例化Bean有三种方式,分别是构造器实例化、静态工厂方式实例化和实例工厂方式实例化。本节将针对这三种方式分别进行讲解。构造器实例化构造器实例化是指Spring容器通过Bean对应的类中默认的构造函数实例化Bean。下面通过案例演示如何使用构造器实例化Bean。1\.创建项目并导入JAR包在MyEclipse中
Stella981 Stella981
2年前
Python之设计模式
一、设计模式分类a、创建型模式简单工厂模式一、内容不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例。二、角色工厂角色(Creator)抽象产品角色(Product)具体产品角色(ConcreteProduct)
Wesley13 Wesley13
2年前
C#设计模式 —— 工厂模式
。  工厂模式同样是项目中最常用的设计模式,工厂模式中又分为简单工厂,工厂方法,抽象工厂。下面我们由简单的开始逐一介绍。1.简单工厂模式  简单工厂又被称为静态工厂,在设计模式中属于创建型模式。主要解决的问题是封装了实例化的过程,通过传入参数来获不同实例。下面我们举一个项目中可能会用到的例子。  假设我们程序的数据保存在几个不同
Wesley13 Wesley13
2年前
Java设计模式
模式描述工厂方法模式提供一个用于创建产品的接口,由实现类决定实现哪些产品。工厂方法模式使一个类的实例化延迟到子类,并且只适用于一个产品的等级结构。优点可以一定程度上解耦,消费者和产品实现类隔离开,只依赖产品接口(抽象产品),产品实现类如何改动与消费者完全无关。例子还是以之前简单工厂的手机为案例:/
Wesley13 Wesley13
2年前
23种设计模式(面向对象语言)
一、设计模式的分类总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建、组合和表示方式。所有的创建型模式都有两个主要功能:  1.将系统所使用的具体类的信息封装起来  2.隐藏
Wesley13 Wesley13
2年前
JS创建对象模式7种方法详解
创建对象的几种模式虽然Object构造函数或者字面量,都可以用来创建对象,但这些方式有明显的缺点:使用同一个接口创建很多对象,会产生大量的代码,于是,工厂模式诞生了1工厂模式工厂模式是广为人知的设计模式,抽象了创建具体对象的过程。在ES6的Class创建类之前,是无法创建类的,开发人员就发明了一种函数,用函数来封
Wesley13 Wesley13
2年前
C++ 常用设计模式(学习笔记)
设计模式1、工厂模式在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式作为一种创建模式,一般在创建复杂对象时,考虑使用;在创建简单对象时,建议直接new完成一个实例对象的创建。1.1、简单工厂模式主要特点是需要在工厂类中做判断,从而创造相应的产品,当