zoukankan      html  css  js  c++  java
  • 设计模式课程 设计模式精讲 5-2 工厂方法coding

    1    课堂讲义

    1.1  产品等级和产品簇

    2    代码演练

    2.1  工厂方法代码演练

    1    课堂讲义
    1.1  产品等级和产品簇

    工厂方法是为了解决同一产品等级的业务抽象问题

    抽象工厂方法是为了解决同一产品簇的问题

     产品等级:

    相同类型的产品为同一产品等级。

    比如:汽车有大众汽车,长安汽车,奥迪汽车等。长安汽车和奥迪汽车,大众汽车属于同一产品等级.

     产品簇:

    长安汽车,长安摩托车,长安自行车。

    2    代码演练
    2.1  工厂方法代码演练

    测试类:

    package com.geely.design.pattern.creational.factorymethod;
    
    public class Test {
        /**
         * 注:此为反例,
         * 没有用简单工厂模式之前,需要new对象。
         * @param args
         */
    //    public static void main(String [] args){
    //        Video video = new JavaVideo();
    //        video .printVideo();
    //    }
    
        /**
         * 2    简单工厂模式
         * 这里通过参数调取工厂类,直接获得工厂子类
         * 可以使用静态方法来创建工厂,优点是工厂类不用new了,但是缺点是静态方法继承后无法修改父类
         * @param args
         */
    //    public static void main(String [] args){
    //        VideoFactory videoFactory = new VideoFactory();
    //        Video video = videoFactory.getVideo("net");
    //        video .printVideo();
    //    }
    
        /**
         * 3    简单工厂模式
         * 通过反射机制,获得工厂子类
         * @param args
         */
    //    public static void main(String [] args){
    //            VideoFactory videoFactory = new VideoFactory();
    //            //通过反射获取子类
    //            Video video = videoFactory.getVideo(JavaVideo.class);
    //            video.printVideo();
    //    }
    
        /**
         * 4      工厂模式
         */
        public static void main(String [] args){
            VideoFactory videoFactory = new JavaVideoFactory();
            VideoFactory videoFactory1 = new NetVideoFactory();
            Video javaVideo = videoFactory.getVideo();
            Video netVideo = videoFactory1.getVideo();
            javaVideo.printVideo();
            netVideo.printVideo();
        }
    }

    video抽象工厂类:

    package com.geely.design.pattern.creational.factorymethod;
    
    public abstract class VideoFactory {
        private Video video = null;
    
        /**
         * 可以使用静态方法来构建
         * @param c
         * @return
         */
    //    public Video getVideo(String param) {
    //        if("java".equals(param)){
    //            return  new JavaVideo();
    //        }else if("net".equals(param)){
    //            return  new ();
    //        }else{
    //            return null;
    //        }
    //    }
    
    
    //    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 Video getVideo();
    }

    javavideo工厂类:

    package com.geely.design.pattern.creational.factorymethod;
    
    public class JavaVideoFactory extends VideoFactory{
        /**
         * 这里实现抽象方法 getVideo
         * @return
         */
        @Override
        public Video getVideo() {
            Video video = new JavaVideo();
            return video;
        }
    }

    netvideo工厂类:

    package com.geely.design.pattern.creational.factorymethod;
    
    public class NetVideoFactory extends VideoFactory{
        /**
         * 这里生成netVideo
         * @return
         */
        @Override
        public Video getVideo() {
            Video video = new NetVideo();
            return video;
        }
    }

    video类:

    package com.geely.design.pattern.creational.factorymethod;
    
    public abstract class Video {
        public abstract void printVideo();
    }

    javavideo类:

    package com.geely.design.pattern.creational.factorymethod;
    
    public class JavaVideo extends Video {
        @Override
        public void printVideo() {
            System.out.println("录制java视频");
        }
    }

    netvideo类:

    package com.geely.design.pattern.creational.factorymethod;
    
    public class NetVideo extends Video{
        @Override
        public void printVideo() {
            System.out.println("录制.Net视频!");
        }
    }

    打印日志:

    "C:Program FilesJavajdk1.6.0_43injava.exe" "-javaagent:D:javadevolopKitideaanZhIntelliJ IDEA Community Edition 2018.1.4libidea_rt.jar=31524:D:javadevolopKitideaanZhIntelliJ IDEA Community Edition 2018.1.4in" -Dfile.encoding=UTF-8 -classpath "C:Program FilesJavajdk1.6.0_43jrelibcharsets.jar;C:Program FilesJavajdk1.6.0_43jrelibdeploy.jar;C:Program FilesJavajdk1.6.0_43jrelibextdnsns.jar;C:Program FilesJavajdk1.6.0_43jrelibextlocaledata.jar;C:Program FilesJavajdk1.6.0_43jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.6.0_43jrelibextsunmscapi.jar;C:Program FilesJavajdk1.6.0_43jrelibjavaws.jar;C:Program FilesJavajdk1.6.0_43jrelibjce.jar;C:Program FilesJavajdk1.6.0_43jrelibjsse.jar;C:Program FilesJavajdk1.6.0_43jrelibmanagement-agent.jar;C:Program FilesJavajdk1.6.0_43jrelibplugin.jar;C:Program FilesJavajdk1.6.0_43jrelib
    esources.jar;C:Program FilesJavajdk1.6.0_43jrelib
    t.jar;F:xiangmu3XinIdeaoutproductiondesign_pattern" com.geely.design.pattern.creational.factorymethod.Test
    录制java视频
    录制.Net视频!
    
    Process finished with exit code 0
  • 相关阅读:
    MVC根据角色自动选择母版页
    Redis学习笔记~五大数据结果的测试
    Redis学习笔记~Redis提供的五种数据结构
    将不确定变为确定~一切归总为“二”(C#中的位运算有啥用)
    Redis学习笔记~把redis放在DATA层,作为一种数据源,我认为更合理,也更符合我的面向对象原则
    屌丝程序员的那些事(一)毕业那年
    jquery的Flexigrid改造,支持选中行内容获取,两个表格行相互移动,行选中事件,支持dwr
    屌丝程序员的那些事(三)一起培训的那些人
    Centos 64位下搭建android开发环境需要的lib包
    屌丝程序员的那些事(二)第一次面试
  • 原文地址:https://www.cnblogs.com/1446358788-qq/p/11266207.html
Copyright © 2011-2022 走看看