动物类型及子类型:
package simple_factory_mode; /** * 动物类型 */ public interface Animal { /** * 发声 */ void say(); } /** * 猫 */ class Cat implements Animal { @Override public void say() { System.out.println("喵喵!"); } } /** * 狗 */ class Dog implements Animal { @Override public void say() { System.out.println("旺旺!"); } }
动物工厂类:
package simple_factory_mode; /** * 动物工厂类 * 简单(静态)工厂模式有小问题, 一但增加新产品(如羊), * 需要修改已有代码, 违反开闭原则, 但却是用的最多的 */ public class AnimalFactory { /** * 方式1: 创建动物(传入类型) */ public static Animal createAnimal(String type){ if ("猫".equals(type)) {//可以用反射的方式替换字串 return new Cat(); } if ("狗".equals(type)) { return new Dog(); } //如果有新类型需要修改已有代码 return null; } /** * 方式2: 创建猫 */ public static Animal createCat(){ return new Cat(); } /** * 方式2: 创建狗 */ public static Animal createDog(){ return new Dog(); } }
类图:
测试类:
package simple_factory_mode; public class Client { public static void main(String[] args) { //直接创建, 客户需要知道具体类型 Animal c1 = new Cat(); Animal d1 = new Dog(); c1.say(); d1.say(); //方式1: 利用工厂, 客户告诉它我需要什么样类型的对象 //与具体怎样创建工作分离, 符合单一职责, 最少知道原则 Animal c2 = AnimalFactory.createAnimal("猫"); Animal d2 = AnimalFactory.createAnimal("狗"); c2.say(); d2.say(); //方式2 Animal c3 = AnimalFactory.createCat(); Animal d3 = AnimalFactory.createDog(); c3.say(); d3.say(); } }
打印结果:
喵喵! 旺旺! 喵喵! 旺旺! 喵喵! 旺旺!
谢谢声明出处!
转自: http://www.cnblogs.com/gscq073240/articles/7127353.html