美文网首页
设计模式之--简单工厂模式

设计模式之--简单工厂模式

作者: 少寨主的互联网洞察 | 来源:发表于2018-11-02 14:48 被阅读0次
    • 首先,我们有一个抽象类
      这个抽象类有个抽象方法,可以产生不同的视频
    public abstract class Video {
        public abstract void produce();
    }
    
    • 然后我们有一个类继承自上面的抽象类
    public class JavaVideo extends Video{
        @Override
        public void produce(){
            System.out.println("录制Java视频");
        }
    }
    

    它负责产生Java视频

    • 同样,我们又有一个类继承自抽象类
    public class PythonVideo extends Video{
        @Override
        public void produce(){
            System.out.println("录制Python的课程视频");
        }
    }
    

    它负责产生python视频

    • 然后我们设计一个工厂类,负责帮我们生产以上两种不同的视频
    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 Test {
        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 Test {
    public static void main(String[] args){
        VideoFactory videoFactory=new VideoFactory();
        Video video=videoFactory.getVideo(JavaVideo.class);
        if(video==null){
            return;
        }
        video.produce();
    }
    }
    

    这样就一定程度满足了开闭原则,整体设计还是不错的

    jdk源码当中哪些用到了呢?

    • 首先我们来看看calendar类
      先看类图


      图片.png

      看看其中一段代码实现

    if (cal == null) {
                // If no known calendar type is explicitly specified,
                // perform the traditional way to create a Calendar:
                // create a BuddhistCalendar for th_TH locale,
                // a JapaneseImperialCalendar for ja_JP_JP locale, or
                // a GregorianCalendar for any other locales.
                // NOTE: The language, country and variant strings are interned.
                if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") {
                    cal = new BuddhistCalendar(zone, aLocale);
                } else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja"
                           && aLocale.getCountry() == "JP") {
                    cal = new JapaneseImperialCalendar(zone, aLocale);
                } else {
                    cal = new GregorianCalendar(zone, aLocale);
                }
            }
            return cal;
    

    这就类似于我们第一种实现方案

    相关文章

      网友评论

          本文标题:设计模式之--简单工厂模式

          本文链接:https://www.haomeiwen.com/subject/dufotqtx.html