升级版的工厂模式(外联配置文件+内用反射),体现多态好处(^-^)

简介: 升级版的工厂模式(外联配置文件+内用反射),体现多态好处(^-^)

升级版的工厂模式(外联配置文件+内用反射),体现多态好处(^-^)

 

工厂模式作用:根据种类生产出对应的类对象

✿ 简单模式:

简单模式:传入参数(type,对象的构造方法的一些参数)
switch(type):
case type1: return 对象1;
case type2: return 对象2;
case type3: return 对象3;
……


✿ 升级版工厂模式:


升级版工厂模式(外联配置文件+内用反射):传入参数(type,对象的构造方法的一些参数)
//① 工厂类通过配置对象通过输入流(输入流是通过类的字节码文件对象class的加载器,然后以流的方式获取资源),加载配置文件到静态代码块(ps:这里的类加载器是扩展类加载器)
配置对象.load(类.class.getClassLoader( ). getResourceAsStream(“配置文件所在路径”);
//②反射,获得字节码文件对象,即类的Class 对象
Class<?>  heroClass = Class.forName(“类名”);
//③ 构造方法实例化对象,分有参、无参构造方法 
// ▪无参,直接通过heroClass.newInstance();   返回类对象
// ▪有参,需要先实例化一个带什么类型参数的构造方法对象Constructor,然后再通过构造方法对象.newInstance(参数);
Constructor constructor = heroClass.getConstructor(参数类的class);
return constructor.newInstance(参数);


小项目代码论证:工厂模式的好处,多态的可升级可维护!

❀英雄类Hero


package PolymorphicFunction;
/**
 * 英雄类
 * @author Huangyujun
 *
 */
public abstract class Hero {
    private String name;        //英雄名称
    private double attack;         //攻击力
    private String weaponName;    //武器名称
    public Hero(String name, double attack, String weaponName) {
        super();
        this.name = name;
        this.attack = attack;
        this.weaponName = weaponName;
    }
    //攻击方法
    public abstract void attack(); 
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getAttack() {
        return attack;
    }
    public void setAttack(double attack) {
        this.attack = attack;
    }
    public String getWeaponName() {
        return weaponName;
    }
    public void setWeaponName(String weaponName) {
        this.weaponName = weaponName;
    }
}


❀战士类Warrior


package PolymorphicFunction;
/**
 * 战士类
 * @author Huangyujun
 *
 */
public class Warrior extends Hero{
    public Warrior(String name, double attack,String weaponName) {
        super(name, attack, weaponName);
    }
    @Override
    public void attack() {
        System.out.println("战士"+ getName() + "举起"+ getWeaponName() +"保家卫国,奋斗到底!");
    }
}


❀英雄工厂类 HeroFactories


package PolymorphicFunction;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Properties;
/**
 * 英雄工厂类,为了免去升级类时修改工厂类的代码,需要使用配置对象加载配置文件
 * 相当于借力,通过配置对象把配置文件和工厂类联系起来,修改配置文件起到了改变工厂类的数据(而不用为了不同数据,为了适用该数据,再去修改工厂)
 * @author Huangyujun
 *
 */
public class HeroFactories {
    private static Properties pro = new Properties();    //配置对象
    /**
     *静态代码块,加载配置文件,通过流加载-流(路径)
     *技巧:通过类的class中的一些方法获取流的加载器,再获得流
     */
    static {
        try {      //注意配置文件路径
            pro.load(HeroFactories.class.getClassLoader().getResourceAsStream("PolymorphicFunction/Properties.properties/Pro.properties"));
            //测试一下,加载是否成功
//            System.out.println(pro.getProperty("warrior"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //静态方法,返回英雄子类
    public static Hero getHeroType(String heroType, String HeroName, double attack, String weaponName) {
        String heroName = pro.getProperty(heroType);
        //反射,获得字节码文件对象,即类的Class 对象
        try {
            Class<?> heroClass = Class.forName(heroName);
            //获取HeroClass构造方法对象
            Constructor<Hero> heroConstructor = (Constructor<Hero>) heroClass.getConstructor(String.class,double.class,String.class);
            return  heroConstructor.newInstance(HeroName,attack,weaponName);
        } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            e.printStackTrace();
        }    
        return null;
    }
}


❀英雄工厂类 HeroFactories


package PolymorphicFunction;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Properties;
/**
 * 英雄工厂类,为了免去升级类时修改工厂类的代码,需要使用配置对象加载配置文件
 * 相当于借力,通过配置对象把配置文件和工厂类联系起来,修改配置文件起到了改变工厂类的数据(而不用为了不同数据,为了适用该数据,再去修改工厂)
 * @author Huangyujun
 *
 */
public class HeroFactories {
    private static Properties pro = new Properties();    //配置对象
    /**
     *静态代码块,加载配置文件,通过流加载-流(路径)
     *技巧:通过类的class中的一些方法获取流的加载器,再获得流
     */
    static {
        try {      //注意配置文件路径
            pro.load(HeroFactories.class.getClassLoader().getResourceAsStream("PolymorphicFunction/Properties.properties/Pro.properties"));
            //测试一下,加载是否成功
//            System.out.println(pro.getProperty("warrior"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //静态方法,返回英雄子类
    public static Hero getHeroType(String heroType, String HeroName, double attack, String weaponName) {
        String heroName = pro.getProperty(heroType);
        //反射,获得字节码文件对象,即类的Class 对象
        try {
            Class<?> heroClass = Class.forName(heroName);
            //获取HeroClass构造方法对象
            Constructor<Hero> heroConstructor = (Constructor<Hero>) heroClass.getConstructor(String.class,double.class,String.class);
            return  heroConstructor.newInstance(HeroName,attack,weaponName);
        } catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            e.printStackTrace();
        }    
        return null;
    }
}


❀测试类test

package PolymorphicFunction;
/**
 * 测试类
 */
import java.util.Properties;
public class test {
    public static void main(String[] args) {
        Hero hero1 = HeroFactories.getHeroType("warrior","铠甲", 80, "长戟");
        hero1.attack();
    }
}


#key=value
warrior=PolymorphicFunction.Warrior
目录
相关文章
|
23天前
|
设计模式
用建造者模式的思想改造构造方法。灵活,快捷的链式创建对象
【10月更文挑战第4天】该文本介绍使用建造者模式改造构造方法,以实现更灵活、快捷的对象创建。建造者模式将复杂对象的构建过程与表示分离,提高代码的灵活性和可维护性。针对传统构造方法参数过多、难以灵活设置属性等问题,通过创建产品类、建造者抽象类和具体建造者类,并采用链式调用来简化对象创建过程。
|
2月前
|
Java 测试技术 Android开发
Android项目架构设计问题之使用反射调用类的私有方法如何解决
Android项目架构设计问题之使用反射调用类的私有方法如何解决
22 0
|
Java C++
面对对象三大特性:封装、继承、多态
面对对象三大特性:封装、继承、多态
|
缓存 监控 Java
Java动态代理:优化静态代理模式的灵活解决方案
Java动态代理:优化静态代理模式的灵活解决方案
219 0
|
设计模式 JSON 数据格式
【工作中问题解决实践 六】基于反射及类装饰模式的数据对比框架(上)
【工作中问题解决实践 六】基于反射及类装饰模式的数据对比框架(上)
113 0
|
JSON 数据库 数据格式
【工作中问题解决实践 六】基于反射及类装饰模式的数据对比框架(下)
【工作中问题解决实践 六】基于反射及类装饰模式的数据对比框架(下)
111 0
|
安全 Java 程序员
java面向对象的三大特性之封装和继承(配视频讲解)
🍅程序员小王的博客:程序员小王的博客 🍅程序员小王的资源博客:http://wanghj.online/ 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线 ———————————————— 版权声明:本文为CSDN博主「程序员小王java」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_44385486/article/details/128171102
157 0
java面向对象的三大特性之封装和继承(配视频讲解)
|
Java
Java面向对象进阶4——多态的弊端及解决方法
多态本身是子类类型向父类类型向上转换(自动转换)的过程,这个过程是默认的。当父类引用指向一个子类对象时,便是向上转型。
118 0
Java面向对象进阶4——多态的弊端及解决方法
|
uml
工厂模式+配置文件+反射实现数据访问程序
工厂模式+配置文件+反射实现数据访问程序
97 0
工厂模式+配置文件+反射实现数据访问程序