- 一、简单工厂定义与类型
- 二、简单工厂适用场景
- 三、简单工厂优点
- 四、简单工厂缺点
- 五、简单工厂示例
- 六、jdk源码中使用简单工厂的示例
1、定义:由一个工厂对象决定创建出哪一种产品类的实例 2、类型:创建型,但不属于GOF23种设计模式
二、简单工厂适用场景1、工厂类负责创建的对象比较少 2、客户端(应用层)只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心
三、简单工厂优点只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节
四、简单工厂缺点工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则
五、简单工厂示例1、示例
- 没有使用简单工厂示例如下: (1)、定义一个视频抽象类,创建一个生产视频的抽象方法
package com.rf.designPatterns.simpleFactory.test1;
/**
* @description: 定义一个视频抽象类
* @author: xiaozhi
* @create: 2020-05-05 14:33
*/
public abstract class Video extends com.rf.designPatterns.simpleFactory.test3.Video {
//生产视频的一个抽象方法
public abstract void product();
}
(2)、定义一个java视频类,继承视频抽象类,实现生产视频的方法
package com.rf.designPatterns.simpleFactory.test1;
/**
* @description: 定义一个java视频类
* @author: xiaozhi
* @create: 2020-05-05 14:35
*/
public class JavaVideo extends Video {
@Override
public void product() {
System.out.println("录制java视频");
}
}
(3)、定义一个python视频类,继承视频抽象类,实现生产视频的方法
package com.rf.designPatterns.simpleFactory.test1;
/**
* @description: 定义一个python视频类
* @author: xiaozhi
* @create: 2020-05-05 14:35
*/
public class PythonVideo extends Video {
@Override
public void product() {
System.out.println("录制python视频");
}
}
(4)、定义一个测试类
package com.rf.designPatterns.simpleFactory.test1;
/**
* @description: 测试类
* @author: xiaozhi
* @create: 2020-05-05 14:36
*/
public class Test {
public static void main(String[] args) {
Video video1 = new JavaVideo();
video1.product();
Video video2 = new PythonVideo();
video2.product();
}
}
(5)、输出结果如下:
(6)、类图如下:
2、示例
- 利用逻辑判断的方式使用简单工厂示例如下: (1)、定义一个视频抽象类,创建一个生产视频的抽象方法
package com.rf.designPatterns.simpleFactory.test2;
/**
* @description: 定义一个视频抽象类
* @author: xiaozhi
* @create: 2020-05-05 14:33
*/
public abstract class Video extends com.rf.designPatterns.simpleFactory.test3.Video {
//生产视频的一个抽象方法
public abstract void product();
}
(2)、定义一个java视频类,继承视频抽象类,实现生产视频的方法
package com.rf.designPatterns.simpleFactory.test2;
/**
* @description: 定义一个java视频类
* @author: xiaozhi
* @create: 2020-05-05 14:35
*/
public class JavaVideo extends Video {
@Override
public void product() {
System.out.println("录制java视频");
}
}
(3)、定义一个python视频类,继承视频抽象类,实现生产视频的方法
package com.rf.designPatterns.simpleFactory.test2;
/**
* @description: 定义一个python视频类
* @author: xiaozhi
* @create: 2020-05-05 14:35
*/
public class PythonVideo extends Video {
@Override
public void product() {
System.out.println("录制python视频");
}
}
(4)、定义一个成产视频的工厂类
package com.rf.designPatterns.simpleFactory.test2;
/**
* @description: 成产视频的工厂类
* @author: xiaozhi
* @create: 2020-05-05 14:42
*/
public class VideoFactory {
public Video getVideo(String type){
if("java".equalsIgnoreCase(type)){
return new JavaVideo();
}else if("python".equalsIgnoreCase(type)){
return new PythonVideo();
}
return null;
}
}
(5)定义一个测试类
package com.rf.designPatterns.simpleFactory.test2;
/**
* @description: 测试类
* @author: xiaozhi
* @create: 2020-05-05 14:45
*/
public class Test {
public static void main(String[] args) {
VideoFactory videoFactory = new VideoFactory();
Video video1 = videoFactory.getVideo("java");
video1.product();
Video video2 = videoFactory.getVideo("python");
video2.product();
}
}
(6)、输出结果如下: (7)、类图如下:
3、示例
- 利用java反射机制使用简单工厂示例如下:
(1)、定义一个视频抽象类,创建一个生产视频的抽象方法
package com.rf.designPatterns.simpleFactory.test3;
/**
* @description: 定义一个视频抽象类
* @author: xiaozhi
* @create: 2020-05-05 14:33
*/
public abstract class Video extends com.rf.designPatterns.simpleFactory.test3.Video {
//生产视频的一个抽象方法
public abstract void product();
}
(2)、定义一个java视频类,继承视频抽象类,实现生产视频的方法
package com.rf.designPatterns.simpleFactory.test3;
/**
* @description: 定义一个java视频类
* @author: xiaozhi
* @create: 2020-05-05 14:35
*/
public class JavaVideo extends Video {
@Override
public void product() {
System.out.println("录制java视频");
}
}
(3)、定义一个python视频类,继承视频抽象类,实现生产视频的方法
package com.rf.designPatterns.simpleFactory.test3;
/**
* @description: 定义一个python视频类
* @author: xiaozhi
* @create: 2020-05-05 14:35
*/
public class PythonVideo extends Video {
@Override
public void product() {
System.out.println("录制python视频");
}
}
(4)、定义一个成产视频的工厂类
package com.rf.designPatterns.simpleFactory.test3;
/**
* @description: 利用反射机制成产视频的工厂类
* @author: xiaozhi
* @create: 2020-05-05 14:42
*/
public class VideoFactory {
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;
}
}
(5)定义一个测试类
package com.rf.designPatterns.simpleFactory.test3;
/**
* @description: 测试类
* @author: xiaozhi
* @create: 2020-05-05 14:45
*/
public class Test {
public static void main(String[] args) {
VideoFactory videoFactory = new VideoFactory();
//应用层只需要告诉工厂需要录制哪种类型的视频即可
Video video1=videoFactory.getVideo(JavaVideo.class);
video1.product();
Video video2=videoFactory.getVideo(PythonVideo.class);
video2.product();
}
}
(6)、输出结果如下: (7)、类图如下:
1、Calendar类中使用到了简单工厂 (1)、Ctrl+Shift+N,输入Calendar找到Calendar.java类,双击打开Calendar.java类,如下图: (2)、在Canlendar.java类中,按【Alt+7】,打开Structure结构视图,找到getInstance()方法。双击getInstance()方法,在Canlendar.java类定义到代码1611行。如下图:
(3)按【ctrl】,点击createCalendar方法,进入createCalendar方法内部,该方法用static修饰,说明并不考虑扩展性,如下图画红色框的部分用的就是简单工厂。
(4)、类图如下:
(5)、进入类图中Calendar中JapaneseImperialCalendar的实现方法,如下图:
2、jdbc的数据库连接利用反射机制使用到了简单工厂 (1)、按【Ctrl+Shift+N】,输入DriverManager找到DriverManager.java类,双击打开DriverManager.java类,如下图:
(2)、在DriverManager.java类中,按【Alt+7】,打开Structure结构视图,找到getConnection(String url)方法。双击getConnection(String url)方法,在DriverManager.java类定义到代码266行。如下图:
(3)、按【ctrl】,点击getConnection方法,进入getConnection方法内部,如下图画红色框的部分用的就是简单工厂。
3、logger日志使用到了简单工厂 (1)、maven项目的pom文件中引入slf4j和logback依赖,如下图:
(2)、按【Ctrl+Shift+N】,输入LoggerFactory找到LoggerFactory.java文件,双击打开LoggerFactory.java文件,如下图:
(3)在LoggerFactory.java文件中,按【Alt+7】,打开Structure结构视图,找到getLogger(String name) 方法。双击getLogger(String name) 方法,在LoggerFactory.java文件中定义到代码240行。如下图:
(4)按【Ctrl+Alt】,鼠标左键点击getLogger方法,进入getLogger方法的实现类LoggerContext中。如下图:
(5)、画红色框部分使用了简单工厂