Java設計模式之工廠模式
//新建錄製課程接口
public interface Video {
void produce();
}
//新建實現類
public class JavaVideo implements Video {
@Override
public void produce() {
System.out.println("錄製Java課程");
}
}
//新建實現類
public class AndroidVideo implements Video {
@Override
public void produce() {
System.out.println("錄製Android課程");
}
}
//調用
JavaVideo javaVideo=new JavaVideo();
javaVideo.produce();
AndroidVideo androidVideo=new AndroidVideo();
androidVideo.produce();
//結果
錄製Java課程
錄製Android課程
上面是UML類圖, 調用時,依賴了實現類。下面考慮使用簡單工廠。
//新建工廠類
public class VideoFactory {
public Video getVideo(String type){
if ("java".equalsIgnoreCase(type)){
return new JavaVideo();
}else {
return new AndroidVideo();
}
}
}
//調用
VideoFactory videoFactory=new VideoFactory();
Video video=videoFactory.getVideo("java");
video.produce();
//結果
錄製Java課程
此時,調用時不依賴實現類,而是依賴工廠類。但是,簡單工廠模式的缺點是,如果新增其他的實現類,則需要在VideoFactory工廠類裏面進行修改,增加 if 判斷。反覆修改增加風險的同時違反了開閉原則,下面進行優化。
//將工廠類修改如下:
public class VideoFactory {
// public Video getVideo(String type){
// if ("java".equalsIgnoreCase(type)){
// return new JavaVideo();
// }else {
// return new AndroidVideo();
// }
// }
//修改後
public Video getVideo(Class c) {
Video video = null;
try {
video= (Video) Class.forName(c.getName()).newInstance();
} catch (Exception e) { e.printStackTrace(); }
return video;
}
}
//調用
VideoFactory videoFactory=new VideoFactory();
Video video= videoFactory.getVideo(JavaVideo.class);
video.produce();
//結果
錄製Java課程
優化後,調用不依賴實現類,也不依賴工廠類,現在如果新增其他實現類,不需要修改工廠類VideoFactory了。
工廠方法設計模式
//抽象類
public abstract class VideoFactory {
public abstract Video getVideo();
}
//新建實現類
public class JavaVideoFactory extends VideoFactory {
@Override
public Video getVideo() {
return new JavaVideo();
}
}
//新建實現類
public class AndroidVideoFactory extends VideoFactory{
@Override
public Video getVideo() {
return new AndroidVideo();
}
}
//調用
public class Test {
public static void main(String [] a ){
VideoFactory videoFactory=new JavaVideoFactory();
Video video=videoFactory.getVideo();
video.produce();
}
}
//結果
錄製Java課程
下面看看UML的類圖:
抽象工廠設計模式
//新建接口
public interface Video {
void produce();
}
//新建接口
public interface Article {
void produce();
}
//接口實現類
public class JavaVideo implements Video {
@Override
public void produce() {
System.out.println("錄製Java課程");
}
}
//接口實現類
public class JavaArticle implements Article{
@Override
public void produce() {
System.out.println("寫Java學習筆記");
}
}
//產品族裏面有兩個產品,視頻和筆記
public interface CourseFactory {
Video getVideo();
Article getArticle();
}
//工廠類的實現類
public class JavaCourseFactory implements CourseFactory {
@Override
public Video getVideo() {
return new JavaVideo();
}
@Override
public Article getArticle() {
return new JavaArticle();
}
}
//調用
CourseFactory courseFactory=new JavaCourseFactory();
Video video= courseFactory.getVideo();
video.produce();
Article article=courseFactory.getArticle();
article.produce();
//結果
錄製Java課程
寫Java學習筆記
//現在增加一門課程Android,Android課程也包含視頻和筆記
public class AndroidVideo implements Video {
@Override
public void produce() {
System.out.println("錄製Android課程");
}
}
public class AndroidArticle implements Article {
@Override
public void produce() {
System.out.println("寫Android學習筆記");
}
}
//Android課程工廠實現類
public class AndroidCourseFactory implements CourseFactory {
@Override
public Video getVideo() {
return new AndroidVideo();
}
@Override
public Article getArticle() {
return new AndroidArticle();
}
}
//調用
CourseFactory courseFactory2=new AndroidCourseFactory();
Video video2=courseFactory2.getVideo();
video2.produce();
Article article2=courseFactory2.getArticle();
article2.produce();
//結果
錄製Android課程
寫Android學習筆記
下面是UML的類圖: