Java設計模式之工廠模式

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的類圖:

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章