简单工厂模式
1.定义:有一个工厂对象决定创建出哪一种产品类的实例。
2.类型:创建型,但不属于GOF23种设计模式
3.适用场景:工厂类负责创建的对象比较少,客户端(应用层)只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心
4.优点:只需要传入一个正确的参数,就可以获取你所需要的对象而无须知道其创建细节
5.缺点:工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则
6.实例目录package
7.实例UML类图
7.代码
1 package com.geely.design.pattern.creational.simplefactory; 2 3 public abstract class Video { 4 public abstract void produce(); 5 }
1 package com.geely.design.pattern.creational.simplefactory; 2 3 public class JavaVideo extends Video { 4 public void produce() { 5 System.out.println("录制Java课程视频"); 6 } 7 }
1 package com.geely.design.pattern.creational.simplefactory; 2 3 public class PythonVideo extends Video { 4 public void produce() { 5 System.out.println("录制Python课程视频"); 6 } 7 }
1 package com.geely.design.pattern.creational.simplefactory; 2 3 public class VideoFactory { 4 /*public Video getVideo(String type){ 5 if("java".equalsIgnoreCase(type)){ 6 return new JavaVideo(); 7 }else if("python".equalsIgnoreCase(type)){ 8 return new PythonVideo(); 9 } 10 return null; 11 }*/ 12 13 public Video getVideo(Class clazz){ 14 Video video = null; 15 try{ 16 video = (Video) Class.forName(clazz.getName()).newInstance(); 17 }catch(InstantiationException e){ 18 e.printStackTrace(); 19 }catch(IllegalAccessException e){ 20 e.printStackTrace(); 21 }catch(ClassNotFoundException e){ 22 e.printStackTrace(); 23 } 24 return video; 25 } 26 }
1 package com.geely.design.pattern.creational.simplefactory; 2 3 public class Test { 4 public static void main(String[] args) { 5 6 /* Video video = new JavaVideo(); 7 video.produce(); 8 Video video2 = new PythonVideo(); 9 video2.produce();*/ 10 11 /*VideoFactory videoFactory = new VideoFactory(); 12 Video video = videoFactory.getVideo("java"); 13 if(video == null){ 14 return; 15 } 16 video.produce(); 17 Video video2 = videoFactory.getVideo("python"); 18 if(video2 == null){ 19 return; 20 } 21 video2.produce();*/ 22 23 VideoFactory videoFactory = new VideoFactory(); 24 Video video = videoFactory.getVideo(JavaVideo.class); 25 if(video == null){ 26 return; 27 } 28 video.produce(); 29 Video video2 = videoFactory.getVideo(PythonVideo.class); 30 if(video2 == null){ 31 return; 32 } 33 video2.produce(); 34 } 35 }