page contents
  • 1 已解决
    0
    外观模式和命令模式的区别

    Java小白求救,外观模式和命令模式有什么区别,它们都是把复杂逻辑屏蔽,只对外提供一个接口。具体要怎么分辨这两个模式呀!

  • 1 未解决
    0
    抽象工厂模式的理解

    抽象工厂模式理解女娲造人案例,以产品族和产品等级来理解该案例
    1、男人、女人、双性人->产品族 、肤色->产品等级
    2、人->产品族 各种肤色、性别的人->产品等级
    以上两种以哪种方式来理解比较正确?
    能否给出具体的理由

  • 1 未解决
    0
    设计模式之策略模式

    /**

     * 相当于是项目经理的角色

     * Created by Tom.

     */

    public class DispatcherServlet extends HttpServlet{


        private List<Handler> handlerMapping = new ArrayList<Handler>();


        public void init() throws ServletException {

            try {

                Class<?> memberControllerClass = MemberController.class;

                handlerMapping.add(new Handler()

                        .setController(memberControllerClass.newInstance())

                        .setMethod(memberControllerClass.getMethod("getMemberById", new Class[]{String.class}))

                        .setUrl("/web/getMemberById.json"));

            }catch(Exception e){


            }

        }


        private void doDispatch(HttpServletRequest request, HttpServletResponse response){


            //1、获取用户请求的url

            //   如果按照J2EE的标准、每个url对对应一个Serlvet,url由浏览器输入

           String uri = request.getRequestURI();


            //2、Servlet拿到url以后,要做权衡(要做判断,要做选择)

            //   根据用户请求的URL,去找到这个url对应的某一个java类的方法


            //3、通过拿到的URL去handlerMapping(我们把它认为是策略常量)

            Handler handle = null;

            for (Handler h: handlerMapping) {

                if(uri.equals(h.getUrl())){

                    handle = h;

                    break;

                }

            }


            //4、将具体的任务分发给Method(通过反射去调用其对应的方法)

            Object object = null;

            try {

                object = handle.getMethod().invoke(handle.getController(),request.getParameter("mid"));

            } catch (IllegalAccessException e) {

                e.printStackTrace();

            } catch (InvocationTargetException e) {

                e.printStackTrace();

            }


            //5、获取到Method执行的结果,通过Response返回出去

    //        response.getWriter().write();


        }



        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

            try {

                doDispatch(req,resp);

            } catch (Exception e) {

                e.printStackTrace();

            }

        }



        class Handler{


            private Object controller;

            private Method method;

            private String url;


            public Object getController() {

                return controller;

            }


            public Handler setController(Object controller) {

                this.controller = controller;

                return this;

            }


            public Method getMethod() {

                return method;

            }


            public Handler setMethod(Method method) {

                this.method = method;

                return this;

            }


            public String getUrl() {

                return url;

            }


            public Handler setUrl(String url) {

                this.url = url;

                return this;

            }

        }



    }

    为什么说handle是策略模式,而不是容器工厂
  • 1 未解决
    0
    关于注册式单例+简单工厂的疑问

    看了tom老师第三期的策略模式章节的视频,tom老师举了一个咕泡学院做活动的例子。在仅仅用了策略模式的时候,还是避免不了出现很多if else,然后老师结合使用了简单工厂,注册式单例----
    我在具体使用中,具体的策略类里面 怎么注入对应的dao,因为这些策略类不被spring所管理,@Autowired不了…
    表达的不是很好,见笑了

  • 1 未解决
    0
    关于容器是单例,容器一定需要使用线程安全的集合吗
    1. 使用的容器集合 在getBean 加锁后,还有必要使用线程安全的集合吗?
    2. 如果不使用会造成什么样的后果?
    
    
    

    public class DependencyInjectionSingleton {

    // 在 getBean 加锁后 这个地方有必要使用 ConcurrentHashMap 吗 private static final Map<String, Object> IOC = new HashMap<>();

    private DependencyInjectionSingleton() { System.out.println("我实例化了"); }

    // 方法这儿必须加锁,不然会实例多个 public static Object getBean(String name) { synchronized (IOC) { if (!IOC.containsKey(name)) { try { Object obj = Class.forName(name).newInstance(); IOC.put(name, obj); return obj; } catch (Exception e) { e.printStackTrace(); } } return IOC.get(name); } }

    static class TestRun implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + "---" + getBean("create.singleton.inject.DependencyInjectionSingleton")); } }

    public static void main(String[] args) throws InterruptedException { long start = System.currentTimeMillis(); ThreadPoolExecutor executor = ThreadPool.getExecutor(); executor.execute(new TestRun()); executor.execute(new TestRun()); executor.execute(new TestRun()); executor.execute(new TestRun()); executor.execute(new TestRun()); executor.execute(new TestRun()); executor.shutdown(); Thread thread = new Thread(new TestRun()); thread.start(); thread.join(); long end = System.currentTimeMillis(); System.out.println("耗时--" + (end - start) + "ms"); }

    }

    多次运行结果 不使用 ConcurrentHashMap 没有发现异常情况。

  • 1 未解决
    0
    设计模式之策略模式

    /**

     * 相当于是项目经理的角色

     * Created by Tom.

     */

    public class DispatcherServlet extends HttpServlet{


        private List<Handler> handlerMapping = new ArrayList<Handler>();


        public void init() throws ServletException {

            try {

                Class<?> memberControllerClass = MemberController.class;

                handlerMapping.add(new Handler()

                        .setController(memberControllerClass.newInstance())

                        .setMethod(memberControllerClass.getMethod("getMemberById", new Class[]{String.class}))

                        .setUrl("/web/getMemberById.json"));

            }catch(Exception e){


            }

        }


        private void doDispatch(HttpServletRequest request, HttpServletResponse response){


            //1、获取用户请求的url

            //   如果按照J2EE的标准、每个url对对应一个Serlvet,url由浏览器输入

           String uri = request.getRequestURI();


            //2、Servlet拿到url以后,要做权衡(要做判断,要做选择)

            //   根据用户请求的URL,去找到这个url对应的某一个java类的方法


            //3、通过拿到的URL去handlerMapping(我们把它认为是策略常量)

            Handler handle = null;

            for (Handler h: handlerMapping) {

                if(uri.equals(h.getUrl())){

                    handle = h;

                    break;

                }

            }


            //4、将具体的任务分发给Method(通过反射去调用其对应的方法)

            Object object = null;

            try {

                object = handle.getMethod().invoke(handle.getController(),request.getParameter("mid"));

            } catch (IllegalAccessException e) {

                e.printStackTrace();

            } catch (InvocationTargetException e) {

                e.printStackTrace();

            }


            //5、获取到Method执行的结果,通过Response返回出去

    //        response.getWriter().write();


        }



        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

            try {

                doDispatch(req,resp);

            } catch (Exception e) {

                e.printStackTrace();

            }

        }



        class Handler{


            private Object controller;

            private Method method;

            private String url;


            public Object getController() {

                return controller;

            }


            public Handler setController(Object controller) {

                this.controller = controller;

                return this;

            }


            public Method getMethod() {

                return method;

            }


            public Handler setMethod(Method method) {

                this.method = method;

                return this;

            }


            public String getUrl() {

                return url;

            }


            public Handler setUrl(String url) {

                this.url = url;

                return this;

            }

        }



    }


    为什么说handle是策略模式,而不是容器工厂

  • 1 未解决
    0
    单例模式如何防范反射机制

    看单例模式视频时,发现老师通过在构造方法里面增加判断的方式防止被反射,但是实际测试代码中,发现如果先反射,然后再用getInstance方法,获取的对象不是同一个,请大神帮忙看看,谢谢~


    public class DoubleCheckLazySingleton {

        private DoubleCheckLazySingleton() throws Exception {

            if (instance != null) {

                throw new Exception("单例不允许被反射");

            }

        }


        private static DoubleCheckLazySingleton instance;


        public static DoubleCheckLazySingleton getInstance() throws Exception {

            if (instance == null) {

                synchronized (DoubleCheckLazySingleton.class) {

                    if (instance == null) {

                        instance = new DoubleCheckLazySingleton();

                    }

                }

            }


            return instance;

        }

    }

    测试方法


    public class DestroySingleByReflect {

        public static void main(String[] args) throws Exception {

            DoubleCheckLazySingleton oinstance = null;

    DoubleCheckLazySingleton oinstance2 = null;

            DoubleCheckLazySingleton oinstance3 = null;

            Class clazz = DoubleCheckLazySingleton.class;

            try {

                Constructor c = clazz.getDeclaredConstructor();

                c.setAccessible(true);

                oinstance = (DoubleCheckLazySingleton) c.newInstance();

        oinstance2 = (DoubleCheckLazySingleton) c.newInstance();

                oinstance3 = (DoubleCheckLazySingleton) c.newInstance();

            } catch (Exception e) {

                e.printStackTrace();

            }

            DoubleCheckLazySingleton instance = DoubleCheckLazySingleton.getInstance();

            System.out.println(oinstance);

    System.out.println(oinstance2);

    System.out.println(oinstance3);

            System.out.println(instance);

        }

    }

    测试结果



    com.xx.singleton.lazy.DoubleCheckLazySingleton@1b6d3586

    com.xx.singleton.lazy.DoubleCheckLazySingleton@4554617c

    com.xx.singleton.lazy.DoubleCheckLazySingleton@74a14482

    com.xx.singleton.lazy.DoubleCheckLazySingleton@1540e19d

  • 1 未解决
    0
    DAO设计模式

    下面代码中IEmpService是一个接口类,EmpServiceImpl是一个接口实现类,请问一下getIEmpServiceInstance这个方法的返回值为什么是IEmpService呢,直接返回EmpServiceImpl类中的方法不行吗?


    public class ServiceFactory {

    public static IEmpService getIEmpServiceInstance()

    {

    return new EmpServiceImpl();

    }

    }

  • 1 已解决
    5
    关于单利模式恶汉式和内部类方式有优劣之分吗?

    attachments-2019-12-0vXX2xir5e0afb2c88bc7.png

    上面两种单利模式写法我觉得没有优劣之分,本质都是一样的,内部类和恶汉式写法都是在在加载的时候就初始化。 不知道大家怎么看?

  • 1 未解决
    0
    单例模式如何防范反射机制

    看单例模式视频时,发现老师通过在构造方法里面增加判断的方式防止被反射,但是实际测试代码中,发现如果先反射,然后再用getInstance方法,获取的对象不是同一个,请大神帮忙看看,谢谢~

    public class DoubleCheckLazySingleton {

        private DoubleCheckLazySingleton() throws Exception {

            if (instance != null) {

                throw new Exception("单例不允许被反射");

            }

        }


        private static DoubleCheckLazySingleton instance;


        public static DoubleCheckLazySingleton getInstance() throws Exception {

            if (instance == null) {

                synchronized (DoubleCheckLazySingleton.class) {

                    if (instance == null) {

                        instance = new DoubleCheckLazySingleton();

                    }

                }

            }


            return instance;

        }

    }

    测试方法

    public class DestroySingleByReflect {

        public static void main(String[] args) throws Exception {

            DoubleCheckLazySingleton oinstance = null;

    DoubleCheckLazySingleton oinstance2 = null;

            DoubleCheckLazySingleton oinstance3 = null;

            Class clazz = DoubleCheckLazySingleton.class;

            try {

                Constructor c = clazz.getDeclaredConstructor();

                c.setAccessible(true);

                oinstance = (DoubleCheckLazySingleton) c.newInstance();

        oinstance2 = (DoubleCheckLazySingleton) c.newInstance();

                oinstance3 = (DoubleCheckLazySingleton) c.newInstance();

            } catch (Exception e) {

                e.printStackTrace();

            }

            DoubleCheckLazySingleton instance = DoubleCheckLazySingleton.getInstance();

            System.out.println(oinstance);

    System.out.println(oinstance2);

    System.out.println(oinstance3);

            System.out.println(instance);

        }

    }

    测试结果

    com.xx.singleton.lazy.DoubleCheckLazySingleton@1b6d3586

    com.xx.singleton.lazy.DoubleCheckLazySingleton@4554617c

    com.xx.singleton.lazy.DoubleCheckLazySingleton@74a14482

    com.xx.singleton.lazy.DoubleCheckLazySingleton@1540e19d