名著解读-Effective Java 第一章 01 工厂模式替代构造方法

ぐ巨炮叔叔 提交于 2020-10-03 12:26:23

为什么使用工厂模式替代构造方法

优点1:每个方法都有自己的名字
优点2:不必每次都去创建一个新的对象,节省内存
优点3:可以返回子类

代码

动物类Animal

public class Animal {

    //种类
    private  String kind =null;
    public Animal(String kind){
        this.kind = kind;
    }
    public Animal(){
    }

    public String getKind() {
        return kind;
    }

    public void setKind(String kind) {
        this.kind = kind;
    }
}

猫类 cat

public class Cat extends  Animal{
    private String name;

    public  Cat(String name,String kind){
        this.name = name;
        super.setKind(kind);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

动物工厂类 AnimalFactory

public class AnimalFactory {

    private static ConcurrentHashMap <String,Animal> map = new ConcurrentHashMap<>();
    private static ConcurrentHashMap <String,Animal> cat = new ConcurrentHashMap<>();

    public static Animal getCat(){

        return  getAnimal("cat");
    }

    public static Animal getDog(){

        return  getAnimal("Dog");
    }

    //波斯猫
    public static Animal getPersianCat (){

        return  getAnimal("波斯猫","Cat");
    }

    //单例懒汉模式
    private static  Animal getAnimal(String kind){
        if(map.get(kind)==null){
            Animal  animal =new Animal(kind);
            map.put(kind,animal);
        }
        return map.get(kind);
    }

    //单例懒汉模式
    private static  Animal getAnimal(String name,String kind){
        if(cat.get(kind)==null){
            Cat  animal =new Cat(name,kind);
            cat.put(kind,animal);
        }
        return cat.get(kind);
    }


}

测试类

public class Test {

    public static void main(String [] args) {
        animal ();

        
//        优点1:每个方法都有自己的名字,如我要猫的动物AnimalFactory.getCat()
//        优点2:不必每次都去创建一个新的对象,节省内存
       animalFactory();
        //获取一只波斯猫
        //优点3:可以返回子类
       Cat cat = (Cat) AnimalFactory.getPersianCat();
        System.out.println(cat.getName());

    }


     public  static void  animal (){
         for(int i=0;i<90000;i++){
             if(i%2==0){
                 System.out.println(new Animal("Cat").getKind() );
             }
             if(i%2!=0){
                 System.out.println(new Animal("Dog").getKind() );
             }
         }

         System.out.println("freeMemory:"+Runtime.getRuntime().freeMemory()/1024/1024 + " M");
         System.out.println("totalMemory:"+Runtime.getRuntime().totalMemory()/1024/1024 + " M");
         long use =Runtime.getRuntime().totalMemory()/1024/1024  -  +Runtime.getRuntime().freeMemory()/1024/1024;
         System.out.println("uses:"+use + " M");
     }


    public  static void  animalFactory (){
        for(int i=0;i<90000;i++){
            if(i%2==0){
                System.out.println(AnimalFactory.getCat().getKind() );
            }
            if(i%2!=0){
                System.out.println(AnimalFactory.getDog().getKind() );
            }
        }

        System.out.println("freeMemory:"+Runtime.getRuntime().freeMemory()/1024/1024 + " M");
        System.out.println("totalMemory:"+Runtime.getRuntime().totalMemory()/1024/1024 + " M");
        long use =Runtime.getRuntime().totalMemory()/1024/1024  -  +Runtime.getRuntime().freeMemory()/1024/1024;
        System.out.println("uses:"+use + " M");
    }

}

测试

animal (); 使用构造器 生产对象

可以看到 使用内存占用了14M

animalFactory();用工厂返回对象

可以看到 使用内存占用了13M,利用单例模式可以有效减少内存的占用

 AnimalFactory.getPersianCat(); 利用工厂模式返回一只波斯猫

//优点3可以返回字类
Cat cat = (Cat) AnimalFactory.getPersianCat();
 System.out.println(cat.getName());

代码地址 https://gitee.com/406/DesignPattern.git

\src\one目录中

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!