zoukankan      html  css  js  c++  java
  • java23种设计模式(一)工厂方法模式

    在说工厂方法模式之前,先了解一下简单工厂模式。工厂方法模式其实是在简单工厂上面做了一些增强。
    简单工厂模式:有一个专门的类来生产其他类的实例,生产的这些实例有一个共同父类。这个跟我们的多态有一点像。
    例子:
    假如我们有一个鼠标工厂,这个工厂既可以生产联想鼠标,又可以生产宏碁鼠标。
    代码如下:
    1、鼠标工厂(可以生产联想鼠标和宏碁鼠标)

    public class MouseFactory {
    
        /**
         * 生产一个鼠标
         * @param i
         * @return
         */
         public Mouse createMouse(int i){
    
            Mouse mouse = null;
            switch (i){
                case 1:
                    mouse = new LenovoMouse();
                    break;
                case 2:
                    mouse = new AcerMouse();
                    break;
            }
            return mouse;
        }
    }
    

    2、鼠标接口(有一个getName()的方法)

    public interface Mouse {
    
        void getName();
    }
    

    3、联想鼠标实现类(实现鼠标接口,可以生产联想鼠标)

    public class LenovoMouse implements Mouse {
        @Override
        public void getName() {
            System.out.println("这个是联想鼠标");
        }
    }
    

    4、宏碁鼠标实现类(实现鼠标接口,可以生产宏碁鼠标)

    public class AcerMouse implements Mouse {
        @Override
        public void getName() {
            System.out.println("这个是宏碁鼠标");
        }
    }
    

    5、客户端(需要鼠标的人,可以买联想鼠标也可以买宏碁鼠标)

    @SpringBootTest
    class FactoryApplicationTests {
    
        @Test
        void contextLoads() {
    
            MouseFactory factory = new MouseFactory();
            Mouse mouse = factory.createMouse(2);
            mouse.getName();
        }
    

    这样简单工厂就算实现了,可以传入1和2让工厂分别生成联想鼠标和宏碁鼠标。
    接下来我们在简单工厂的基础上看看工厂方法模式。
    工厂方法模式:定义一个专门生产其他类实例的接口,让子类决定具体生产哪个类的实例。
    例子:
    有一个鼠标工厂开了两个子公司,一个是联想鼠标工厂用来专门生产联想鼠标,另一个是宏碁鼠标工厂用来专门生产宏碁鼠标。
    代码如下:
    1、鼠标工厂接口:

    public interface MouseFactory {
    
        Mouse createMouse();
    }
    

    2、联想鼠标工厂(用来生产联想鼠标)

    public class LenovoMouseFactory implements MouseFactory {
        @Override
        public Mouse createMouse() {
            return new LenovoMouse();
        }
    }
    

    3、宏碁鼠标工厂(用来生产宏碁鼠标)

    public class AcerMouseFactory implements MouseFactory {
        @Override
        public Mouse createMouse() {
            return new AcerMouse();
        }
    }
    

    鼠标类跟简单工厂一样,复制如下:
    4、鼠标接口(有一个getName()的方法)

    public interface Mouse {
    
        void getName();
    }
    

    5、联想鼠标实现类(实现鼠标接口,可以生产联想鼠标)

    public class LenovoMouse implements Mouse {
        @Override
        public void getName() {
            System.out.println("这个是联想鼠标");
        }
    }
    

    6、宏碁鼠标实现类(实现鼠标接口,可以生产宏碁鼠标)

    public class AcerMouse implements Mouse {
        @Override
        public void getName() {
            System.out.println("这个是宏碁鼠标");
        }
    }
    

    7、客户端(需要鼠标的人,可以买联想鼠标也可以买宏碁鼠标)

    @SpringBootTest
    class FactoryApplicationTests {
        @Test
        void demo(){
    
            LenovoMouseFactory lenovoMouseFactory = new LenovoMouseFactory();
            Mouse lenovoMouse = lenovoMouseFactory.createMouse();
            lenovoMouse.getName();
    
            AcerMouseFactory acerMouseFactory = new AcerMouseFactory();
            Mouse acerMouse = acerMouseFactory.createMouse();
            acerMouse.getName();
        }
    }
    

    我们可以通过不同的工厂来获取不同实例,假如我们想买一个联想鼠标,则去联想工厂买。想买宏碁鼠标,则去宏碁工厂买。
    这样,我们就实现了工厂方法模式,假如我们想要一个华硕鼠标,则建一个华硕工厂去生产华硕鼠标即可。

    如果文章对您有帮助,请记得点赞关注哟~
    欢迎大家关注我的公众号<情系IT>,每日技术推送文章供大家学习参考。

  • 相关阅读:
    过桥问题
    修改state中数组对象某一个字段(state中某个属性为对象或数组时,需要修改该对象中的某一个属性)
    git 如何提交,新建, 拉取远程分支,git基本操作,git新手教学
    el-image组件大图预览不能定位当前图片的处理
    vue数组遍历动态渲染到页面
    vue路由传参的三基本方式
    git push时报错:error: failed to push some refs to/hint: Updates were rejected because the tip of your current branch is behind/hint: its remote counterpart. Integrate the remote changes
    时间格式转换/时间戳的转换
    Day.js :一个轻量的处理时间和日期的 JavaScript 库
    node多版本管理(node版本切换、node版本更新及降低版本)
  • 原文地址:https://www.cnblogs.com/zhixie/p/11696327.html
Copyright © 2011-2022 走看看