使用工厂模式+反射创建对象

 

项目结构

 

 

1.配置文件

config,properties

packageName = com.woniu.dao.impl

2.自定义注解

package com.woniu.util;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface EnableDao {

}

3,定义动物接口,实现类,并在某一个类上添加注解

package com.woniu.dao;

public interface Animal {
    public void eat();
}
package com.woniu.dao.impl;

import com.woniu.dao.Animal;

public class Cat implements Animal{

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
        
    }

}
package com.woniu.dao.impl;

import com.woniu.dao.Animal;
import com.woniu.util.EnableDao;

@EnableDao
public class Dag implements Animal {

    @Override
    public void eat() {
        System.out.println("狗吃骨头");

    }

}
package com.woniu.dao.impl;

import com.woniu.dao.Animal;

public class Pig implements Animal{

    @Override
    public void eat() {
        // TODO Auto-generated method stub
        
    }

}

3定义工厂类

package com.woniu.util;

import java.io.File;
import java.io.InputStream;
import java.net.URI;
import java.net.URL;
import java.util.Properties;

import com.woniu.dao.Animal;

public class Factory {
    
    public Animal getAnimal() {
        Properties properties = new Properties();
        Animal instance=null;
        try(InputStream in = Factory.class.getClassLoader().getResourceAsStream("config2.properties")) {
            properties.load(in);
            //得到包名
            String packageName = properties.getProperty("packageName");
            //获取包的完整路径
            URL url = Factory.class.getClassLoader().getResource(packageName.replace('.', File.separatorChar));
            URI uri = new URI(url.toString());
            File file = new File(uri);
            //获取包下的所有类
            String[] lists = file.list();
            for(String list:lists) {
                //拼凑类名
                String className = packageName + "."+list.substring(0, list.lastIndexOf("."));
                Class<?> clazz = Class.forName(className);
                if(clazz.isAnnotationPresent(EnableDao.class)) {
                    instance =(Animal) clazz.newInstance();
                }
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
        
        return instance;
    }
}

Main类

package com.woniu.main;

import com.woniu.dao.Animal;
import com.woniu.util.Factory;

public class MainApp {
    public static void main(String[] args) {
        Factory factory = new Factory();
        Animal animal = factory.getAnimal();
        animal.eat();
    }
}

 

posted @ 2022-07-30 19:13  传说中的旅行者  阅读(68)  评论(0)    收藏  举报