简单工厂
定义:由一个工厂对象决定创建出哪一种产品类的实例
类型:创建型,但不属于GOF23种设计模式
使用场景:
1.工厂类负责创建的对象比较少
2.客户端(应用层)只知道传入工厂类的参数,对如何创建对象(逻辑)并不关心
优点:
只需要传入一个正确的参数,就可以获取你所需要的对象,而无需知道其创建细节
缺点:
工厂类的职责相对过重,增加新的产品,需要修改工厂类的判断逻辑,违背开闭原则
声明一个抽象类Video和生产视频的方法
public abstract class Video {
abstract void produce();
}
生产Java视频类继承Video
public class JavaVideo extends Video{
@Override
void produce() {
System.out.println("录制Java视频");
}
}
生产Python视频类继承Video
public class PythonVideo extends Video{
@Override
void produce() {
System.out.println("录制Python视频");
}
}
视频简单工厂类
public class VideoFactory {
public Video getVideo(String type) {
switch(type) {
case "java":
return new JavaVideo();
case "python":
return new PythonVideo();
default:
return null;
}
}
}
改进后
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;
}
}
工厂方法
定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行
类型:创建型
适用场景:
创建对象需要大量重复的代码
客户端(应用层)不依赖产品类实例如何被创建,实现等细节
一个类通过其子类来指定创建哪个对象
优点:
用户只需关心所需产品对应的工厂,无需关心创建细节
加入新产品符合开闭原则,提高可扩展性
缺点:
类的个数容易过多,增加复杂度
增加了系统的抽象性和理解难度
代码如下:
视频抽象类
public abstract class Video {
abstract void produce();
}
Java视频类继承Video实现produce()方法
public class JavaVideo extends Video {
@Override
void produce() {
System.out.println("录制Java视频");
}
}
Python视频类继承Video实现produce()方法
public class PythonVideo extends Video {
@Override
void produce() {
System.out.println("录制Python视频");
}
}
视频工厂类
public abstract class VideoFactory {
public abstract Video getVideo();
}
Java视频工厂类继承VideoFactory实现getVideo()方法
public class JavaVideoFactory extends VideoFactory{
@Override
public Video getVideo() {
return new JavaVideo();
}
}
Python视频工厂类继承VideoFactory实现getVideo()方法
public class PythonVideoFactory extends VideoFactory{
@Override
public Video getVideo() {
return new PythonVideo();
}
}
测试类
public class Test {
public static void main(String[] args) {
VideoFactory videoFactory = new JavaVideoFactory();
Video video = videoFactory.getVideo();
video.produce();
}
}