模式的秘密之工廠模式
阿新 • • 發佈:2018-03-03
key draw exceptio 抽象工廠 ide 實例 java block 擴展
工廠模式概念:實例化對象,用工廠模式代替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(); } }
模式的秘密之工廠模式