模式的秘密之工厂模式
工厂模式概念:实例化对象,用工厂模式代替new操作
工厂模式包括工厂方法模式和抽象工厂模式
抽象工厂模式是工厂方法模式的扩展
工厂模式的意图:定义一个接口来创建对象,但让子类决定哪些类需要被实例化。
工厂方法把实例化的工作推迟到子类中去实现。
工厂方法模式类图
package com.fyf; /** * 发型接口 * @author 18401 * */ public interface HairInterface { //实现了发型 public void draw(); }
package com.fyf; /** * 发型工厂 * @author 18401 * */ public class HairFactory { /** * 根据类型来创建对象 */ public HairInterface getHair(String key){ if("left".equals(key)){ return new LetfHair(); }else if("right".equals(key)){ return new RightHair(); } return null; } public HairInterface getHairByClass(String className){ try { HairInterface hair = (HairInterface) Class.forName(className).newInstance(); return hair; } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
package com.fyf; /** * 左偏分发型 * @author 18401 * */ public class LetfHair implements HairInterface { /** * 画了一个左偏分 */ @Override public void draw() { // TODO Auto-generated method stub System.out.println("----左偏分发型-----"); } }
package com.fyf; /** * 右偏分发型 * @author 18401 * */ public class RightHair implements HairInterface { /** * 画了一个右偏分 */ @Override public void draw() { // TODO Auto-generated method stub System.out.println("----右偏分发型-----"); } }
package com.fyf; public class Test { //客户端 public static void main(String[] args) { // HairInterface left = new LetfHair(); // left.draw(); HairFactory factory = new HairFactory(); // HairInterface left = factory.getHair("left"); // left.draw(); HairInterface left = factory.getHairByClass("com.fyf.LetfHair"); left.draw(); } }