1 课堂讲义
1.1 产品等级和产品簇
2 代码演练
2.1 工厂方法代码演练
1 课堂讲义
1.1 产品等级和产品簇
工厂方法是为了解决同一产品等级的业务抽象问题
抽象工厂方法是为了解决同一产品簇的问题
产品等级:
相同类型的产品为同一产品等级。
比如:汽车有大众汽车,长安汽车,奥迪汽车等。长安汽车和奥迪汽车,大众汽车属于同一产品等级.
产品簇:
长安汽车,长安摩托车,长安自行车。
2 代码演练
2.1 工厂方法代码演练
测试类:
package com.geely.design.pattern.creational.factorymethod; public class Test { /** * 注:此为反例, * 没有用简单工厂模式之前,需要new对象。 * @param args */ // public static void main(String [] args){ // Video video = new JavaVideo(); // video .printVideo(); // } /** * 2 简单工厂模式 * 这里通过参数调取工厂类,直接获得工厂子类 * 可以使用静态方法来创建工厂,优点是工厂类不用new了,但是缺点是静态方法继承后无法修改父类 * @param args */ // public static void main(String [] args){ // VideoFactory videoFactory = new VideoFactory(); // Video video = videoFactory.getVideo("net"); // video .printVideo(); // } /** * 3 简单工厂模式 * 通过反射机制,获得工厂子类 * @param args */ // public static void main(String [] args){ // VideoFactory videoFactory = new VideoFactory(); // //通过反射获取子类 // Video video = videoFactory.getVideo(JavaVideo.class); // video.printVideo(); // } /** * 4 工厂模式 */ public static void main(String [] args){ VideoFactory videoFactory = new JavaVideoFactory(); VideoFactory videoFactory1 = new NetVideoFactory(); Video javaVideo = videoFactory.getVideo(); Video netVideo = videoFactory1.getVideo(); javaVideo.printVideo(); netVideo.printVideo(); } }
video抽象工厂类:
package com.geely.design.pattern.creational.factorymethod; public abstract class VideoFactory { private Video video = null; /** * 可以使用静态方法来构建 * @param c * @return */ // public Video getVideo(String param) { // if("java".equals(param)){ // return new JavaVideo(); // }else if("net".equals(param)){ // return new (); // }else{ // return null; // } // } // public Video getVideo(Class c){ // Video video = null; // try { // video = (Video) Class.forName(c.getName()).newInstance(); // } catch (InstantiationException e) { // e.printStackTrace(); // } catch (IllegalAccessException e) { // e.printStackTrace(); // } catch (ClassNotFoundException e) { // e.printStackTrace(); // } // return video; // } /** * 工厂设计模式,将其改为抽象方法,子方法继承即可。 */ public abstract Video getVideo(); }
javavideo工厂类:
package com.geely.design.pattern.creational.factorymethod; public class JavaVideoFactory extends VideoFactory{ /** * 这里实现抽象方法 getVideo * @return */ @Override public Video getVideo() { Video video = new JavaVideo(); return video; } }
netvideo工厂类:
package com.geely.design.pattern.creational.factorymethod; public class NetVideoFactory extends VideoFactory{ /** * 这里生成netVideo * @return */ @Override public Video getVideo() { Video video = new NetVideo(); return video; } }
video类:
package com.geely.design.pattern.creational.factorymethod; public abstract class Video { public abstract void printVideo(); }
javavideo类:
package com.geely.design.pattern.creational.factorymethod; public class JavaVideo extends Video { @Override public void printVideo() { System.out.println("录制java视频"); } }
netvideo类:
package com.geely.design.pattern.creational.factorymethod; public class NetVideo extends Video{ @Override public void printVideo() { System.out.println("录制.Net视频!"); } }
打印日志:
"C:\Program Files\Java\jdk1.6.0_43\bin\java.exe" "-javaagent:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=31524:D:\java\devolopKit\idea\anZh\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.6.0_43\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\jce.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\resources.jar;C:\Program Files\Java\jdk1.6.0_43\jre\lib\rt.jar;F:\xiangmu3\Xin\Idea\out\production\design_pattern" com.geely.design.pattern.creational.factorymethod.Test
录制java视频
录制.Net视频!
Process finished with exit code 0
诸葛