用一个工厂对象决定建立哪种产品的实例。java
建立型,但不属于GOF23中设计模式。python
工厂类负责建立的对象比较少,客户端(应用层)只知道传入工厂类的参数,对于如何建立对象(逻辑)不关心设计模式
只须要传入一个正确的参数,就能够获取你所须要的对象二无需知道其建立细节。ide
工厂类的职责相对太重,增长新的产品,须要修改工厂类的逻辑判断(随着业务不断增长工厂类的业务逻辑将变难以使人理解),违背开闭原则,没法造成基于继承的等级结构。测试
下面看演示代码spa
假设有个场景咱们有不少视频须要录制。咱们定义个抽象类,叫vido同时有个方法produce。设计
public abstract class Video {
public abstract void produce();
}
复制代码
这个抽象类有一些子类,好比javaVido,PythonVido,code
public class JavaVideo extends Video {
@Override
public void produce() {
System.out.println("录制Java课程视频");
}
}
复制代码
public class PythonVideo extends Video {
@Override
public void produce() {
System.out.println("录制Python课程视频");
}
}
复制代码
假设咱们要获取这两个类的对象,固然咱们能够new这两个类来获取对象,我如今是介绍工程模式,天然要使用工厂模式来建立。咱们如今建立一个工厂类视频
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;
}
}
复制代码
如今写一个测试类看看这个工厂类怎么使用。对象
public class FactoryTest {
public static void main(String[] args) {
VideoFactory videoFactory = new VideoFactory();
Video video = videoFactory.getVideo("java");
if(video == null){
return;
}
video.produce();
}
复制代码
如今来讲说这样写的缺点:这样写咱们每次新增长类都要添加工厂类的代码,长此以往工厂就会变得很是复杂。下面咱们改进一下工厂。
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 class FactoryTest {
VideoFactory videoFactory = new VideoFactory();
Video video = videoFactory.getVideo(JavaVideo.class);
if(video == null){
return;
}
video.produce();
}
}
复制代码
本文最后咱们说一下改进以后的好处。 咱们class类获取对象的好处就是不用每次添加对象都去修改工厂类。