为什么使用工厂模式替代构造方法
优点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目录中
来源:oschina
链接:https://my.oschina.net/u/4039389/blog/4286566