设计模式-工厂模式

发布于:2022-08-08 ⋅ 阅读:(256) ⋅ 点赞:(0)

设计模式之工厂模式

女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是“造人”的工作,这
个词被现代人滥用了。这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风景太优美了,天空是湛
蓝的,水是清澈的,空气是清新的,太美丽了,然后就待时间长了就有点寂寞了,没有动物,这些看的到
都是静态的东西呀,怎么办?

别忘了是神仙呀,没有办不到的事情,于是女娲就架起了八卦炉(技术术语:建立工厂)开始创建人,
具体过程是这样的:先是泥巴捏,然后放八卦炉里烤,再扔到地上成长,但是意外总是会产生的:
第一次烤泥人,兹兹兹兹,感觉应该熟了,往地上一扔,biu,一个白人诞生了,没烤熟!~
第二次烤泥人,兹兹兹兹兹兹兹兹~~,上次都没烤熟,这次多烤会儿,往地上一扔,嘿,熟过头了,
黑人哪!
第三次烤泥人,兹兹~,一边烤一边看着,嘿,正正好,Perfect!优品,黄色人种!【备注:RB 人
不属此列】

/**定义接口:Human

public interface Human{
    
    public void laugh();
    public void cry();
    public void talk();
}

定义白色人种

public class WhileHuman implements Human{
    
    public void cry() {
        System.out.println("我是小白人,我会哭");
    }
    
    public void laugh() {
        System.out.println("我是小白人,我会哭");
    }
    
    public void talk() {
        System.out.println("我是小白人,我会哭");
    }

}

定义黑人

public class BlackHuman implements Human {
    public void cry() {
        System.out.println("我是小黑人,我会哭");
    }
    
    public void laugh() {
        System.out.println("我是小黑人,我会哭");
    }
    
    public void talk() {
        System.out.println("我是小黑人,我会哭");
    }
}

定义黄人

public class Yellowhuman implements Human {
    public void cry() {
        System.out.println("我是小黄人,我会哭");
    }
    
    public void laugh() {
        System.out.println("我是小黄人,我会笑");
    }
    
    public void talk() {
        System.out.println("我是小黄人,我会叫");
    }
}

创建工厂

在这里插入代码片public class  HumanFactory {
    
    private static Map<String,Human> map = new HashMap<String, Human>(16);
    
    public static Human createHuman(Class c){
        
        Human h = null;
        try {
            if(map.containsKey(c.getSimpleName())){
                h = map.get(c.getSimpleName());
            }else{
                h =(Human) Class.forName(c.getName()).newInstance();
                map.put(c.getSimpleName(),h);
            }
            
        }catch (IllegalAccessException e){
            System.out.println("创建失败,非法的类:" + e.getMessage());
        }catch (ClassNotFoundException ex){
            System.out.println("创建失败,没有找到这样的类");
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return h;
    }
    
}
``
这个程序你跑不起来,还得有这个类

```java
public class ClassUtils {
    
    public static List<Class> getAllClassByInterface(Class c){
        List<Class> returnList = new ArrayList<Class>();
        
        if(c.isInterface()){
            //获取当前的包名
            String packageName = c.getPackage().getName();
            try{
                //获取当前包下以及子包下所有的类
                List<Class> allClass = getClasses(packageName);
                
                //判断是否是同一个接口
                for(int i=0;i<allClass.size();i++){
                    if(c.isAssignableFrom(allClass.get(i))){
                        if(!c.equals(allClass.get(i))){
                            returnList.add(allClass.get(i));
                        }
                    }
                }
            
            }catch (Exception e){
            
            }
        }
        return returnList;
    }
    
    
    /**
     * 获取一个包中所有的类
     * @param packageName
     * @return
     */
    private static List<Class> getClasses(String packageName) throws IOException, ClassNotFoundException {
    
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        String path = packageName.replace(".","/");
        Enumeration<URL> resources = classLoader.getResources(path);
        
        List<File> dirs = new ArrayList<File>();
        while (resources.hasMoreElements()){
            URL resource = resources.nextElement();
            dirs.add(new File(resource.getFile()));
        }
        
        ArrayList<Class> classes = new ArrayList<Class>();
        for(File dir : dirs){
            classes.addAll(findClasses(dir,packageName));
        }
        return classes;
    }
    
    private static List<Class> findClasses(File dire,String packageName) throws ClassNotFoundException {
        
        List<Class> classes = new ArrayList<Class>();
        if(!dire.exists()){
            return  classes;
        }
        
        File[] files = dire.listFiles();
        for(File file : files){
            if(file.isDirectory()){
                assert !file.getName().contains(".");
                classes.addAll(findClasses(file,packageName + "." + file.getName()));
            }else if(file.getName().endsWith(".class")){
                classes.add(Class.forName(packageName + "." +   file.getName().substring(0,file.getName().length()-6)));
            }
        }
        return classes;
    }
}

最后声明女娲
public class FactoryApplication {

public static void main(String[] args) {

    Human human = HumanFactory.createHuman();
    human.talk();
    human.laugh();
    human.cry();
}

网站公告

今日签到

点亮在社区的每一天
去签到