您好,欢迎访问代理记账网站
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

5.工厂方法模式Factory Method Pattern--学习笔记

1.女娲创造人:白人,黑人,黄人
2.类图:
在这里插入图片描述
3.程序

public interface Human {


    void laugh();


    void cry();


    void talk();
}

public class BlackHuman implements Human {
    @Override
    public void laugh() {
        System.out.println("Black laugh");
    }


    @Override
    public void cry() {
        System.out.println("Black cry");


    }


    @Override
    public void talk() {
        System.out.println("Black talk");


    }
}

public class WhiteHuman implements Human {
    @Override
    public void laugh() {
        System.out.println("White laugh");
    }


    @Override
    public void cry() {
        System.out.println("White cry");


    }


    @Override
    public void talk() {
        System.out.println("White talk");


    }
}

public class YellowHuman implements Human {
    @Override
    public void laugh() {
        System.out.println("yellow laugh");
    }


    @Override
    public void cry() {
        System.out.println("yellow cry");


    }


    @Override
    public void talk() {
        System.out.println("yellow talk");


    }
}

public class HumanFactory {


    public static Human createHuman(Class c){
        Human human = null;


        try{
            human = (Human)Class.forName(c.getName()).newInstance();
        } catch (IllegalAccessException e) {
            System.out.println("指定颜色");
        } catch (InstantiationException e) {
            System.out.println("定义人类有问题");
        } catch (ClassNotFoundException e) {
            System.out.println("找不到");
        }
        return human;
    }
}

public class NvWa {


    public static void main(String[] args) {
        System.out.println("1");
        Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);
        whiteHuman.cry();
        whiteHuman.laugh();
        whiteHuman.talk();


        System.out.println("2");
        Human blackHuman = HumanFactory.createHuman(BlackHuman.class);
        blackHuman.cry();
        blackHuman.laugh();
        blackHuman.talk();


        System.out.println("3");
        Human yellowHuman = HumanFactory.createHuman(YellowHuman.class);
        yellowHuman.cry();
        yellowHuman.laugh();
        yellowHuman.talk();


    }
}

随机创建黑白黄人
在这里插入图片描述

程序

import java.util.List;
import java.util.Random;


public class HumanFactory {

    //2.随机创建黑白黄人
    public static Human createHuman(){

        Human human = null;

        List<Class> concreteHumanList = ClassUtils.getAllClassByInterface(Human.class);
        Random random = new Random();
        int rand = random.nextInt(concreteHumanList.size());
        human = createHuman(concreteHumanList.get(rand));
        return human;
    }
}


public class NvWa {

    public static void main(String[] args) {
        //2
        for (int i = 0; i < 1000000000; i++) {
            System.out.println("随机产生");
            Human human = HumanFactory.createHuman();
            human.cry();
            human.laugh();
            human.talk();
        }


    }
}

完整类图
在这里插入图片描述
工厂方法模式还有一个非常重要的应用 ,
就是延迟始化 (Lazy initialization):一个对象初始化完毕后就不释放 ,等到再次用到得就不用再次初始化了 ,直接从内存过中拿到就可以了 ,

package shejimoshi.factoryMethodPattern;


import java.util.HashMap;
import java.util.List;
import java.util.Random;


public class HumanFactory {

    //延迟始化
    private static HashMap<String, Human> humans = new HashMap<String, Human>();

    public static Human createHuman1(Class c){

        Human human = null;

        try{
            if(humans.containsKey(c.getSimpleName())){
                human = humans.get(c.getSimpleName());
            }else {
                human = (Human)Class.forName(c.getName()).newInstance();
                humans.put(c.getSimpleName(),human);
            }
        } catch (IllegalAccessException e) {
            System.out.println("指定颜色");
        } catch (InstantiationException e) {
            System.out.println("人类定义错误");
        } catch (ClassNotFoundException e) {
            System.out.println("zhaobudao");
        }
        return human;
    }
}

在这里插入图片描述

很简单 ,就加上了黄色那部分的代码 ,这个在类初始化很消耗资源的情况比较实用 ,比如你要连接硬件 ,或 者 是 为 了 初 始 化 一 个 类 需 要 准 备 比 较 多 条 件(参数 ),通 过 这 种 方 式 可 以 很 好 的 减 少 项 目 的 复 杂 程 度 。


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进