zoukankan      html  css  js  c++  java
  • 设计模式(二)——工厂模式

    工厂模式

    简单工厂模式

    简单工厂模式(Simple Factory Pattern),又称为静态工厂方法(static Factory Method),它属于创建型模式。
    在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
    比如有一个电脑商,目前生产联想电脑,随着业务扩展,他现在需要生产惠普的电脑,我们就需要一个单独的类来专门生产电脑,这就用到了简单工厂模式。
    下面以代码为例:

    接口:

    package designpattern.factory.simplefactory.noodles;
    
    public interface INoodles {
        /**
         * 描述每种面条啥样的
         */
        public abstract void desc();
    }
    
    
    
    package designpattern.factory.simplefactory.noodles;
    
    public class LzNoodles implements INoodles {
        @Override
        public void desc() {
            System.out.println("兰州拉面,兰州特色小吃");
        }
    }
    
    
    package designpattern.factory.simplefactory.noodles;
    
    public class PaoNoodles implements INoodles {
        @Override
        public void desc() {
            System.out.println("泡面,程序员必备");
        }
    }
    
    
    package designpattern.factory.simplefactory.noodles;
    
    public class ReganNoodles implements INoodles {
        @Override
        public void desc() {
            System.out.println("红油热干面,武汉特色小吃");
        }
    }
    
    
    
    简单工厂模式
    package designpattern.factory.simplefactory;
    
    import designpattern.factory.simplefactory.noodles.INoodles;
    import designpattern.factory.simplefactory.noodles.LzNoodles;
    import designpattern.factory.simplefactory.noodles.PaoNoodles;
    import designpattern.factory.simplefactory.noodles.ReganNoodles;
    
    /**
     * 简单工厂模式
     * 一家“简单面馆”(简单工厂类)
     */
    public class SimpleNoodlesFactory {
    
        public static final int TYPE_LZ = 1;//兰州拉面
        public static final int TYPE_PM = 2;//泡面
        public static final int TYPE_GK = 3;//热干面
    
        /**
         * 如果生产对象的方法是static的,这种简单工厂也叫做静态工厂
         * 如果生产对象的方法不是static的,这种简单工厂也叫做实例工厂
         * @param type
         * @return
         */
        public static INoodles createNoodles(int type) {
            switch (type) {
                case 1:
                    return new LzNoodles();
                case 2:
                    return new PaoNoodles();
                case 3:
                    return new ReganNoodles();
                default:
                    return new LzNoodles();
            }
        }
    }
    

    测试

    
    package designpattern.factory.simplefactory;
    
    import designpattern.factory.simplefactory.noodles.INoodles;
    import designpattern.factory.simplefactory.noodles.LzNoodles;
    
    public class Test {
    
        public static void main(String[] args) {
            /**
             *  一开始,穷,想吃面必须得自己做
             *  想吃拉面得自己做,new LzNoodles()
             *  想吃泡面得自己做,new PaoNoodles()
             *  想吃热干面得自己做,new ReganNoodles()
             */
            // 做拉面吃
            INoodles lzNoodles = new LzNoodles();
            // 做泡面吃
            // INoodles paoNoodles = new PaoNoodles();
            // 做热干面吃
            // INoodles reganNoodles = new ReganNoodles();
    
            // 然而,new来new去,改来改去,好心烦......
    
            /**
             * 忽然,有一天走了狗屎运成了暴发户
             * 幸福生活从此来临,吃面从此变得简单
             * 给面馆说一声想吃啥,面馆做好了给自己就好了
             * 自己不必关心面条怎么做(怎么new,如何new)让面馆操心去吧(面馆帮我们new)!
             * 好省心,有钱就是好,太爽了!
             */
            INoodles iNoodles = SimpleNoodlesFactory.createNoodles(2);  // 和具体的对象脱离关系
            iNoodles.desc();
    
            /**考虑使用工厂模式
             * 1) 当客户程序不需要知道要使用对象的创建过程。
             * 2) 客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。
             */
        }
    }
    
    

    工厂方法模式

    工厂方法模式是比较复杂一点的工厂模式的体现,主要是通过创建工厂类来进行对对象的构建。

    package designpattern.factory.factorymethod;
    
    
    import designpattern.factory.simplefactory.noodles.INoodles;
    
    /**
     * 工厂方法模式
     */
    public interface INoodlesFactory {
         INoodles createNoodles();
    }
    
    package designpattern.factory.factorymethod;
    
    
    import designpattern.factory.simplefactory.noodles.INoodles;
    import designpattern.factory.simplefactory.noodles.LzNoodles;
    
    public class LzINoodlesFactory implements INoodlesFactory {
        @Override
        public INoodles createNoodles() {
            return new LzNoodles();
        }
    }
    
    
    package designpattern.factory.factorymethod;
    
    
    import designpattern.factory.simplefactory.noodles.INoodles;
    import designpattern.factory.simplefactory.noodles.PaoNoodles;
    
    public class PaoINoodlesFactory implements INoodlesFactory {
        @Override
        public INoodles createNoodles() {
            return new PaoNoodles();
        }
    }
    
    
    package designpattern.factory.factorymethod;
    
    
    import designpattern.factory.simplefactory.noodles.INoodles;
    import designpattern.factory.simplefactory.noodles.ReganNoodles;
    
    public class ReganINoodlesFactory implements INoodlesFactory {
        @Override
        public INoodles createNoodles() {
            return new ReganNoodles();
        }
    }
    
    

    测试类

    package designpattern.factory.factorymethod;
    
    
    import designpattern.factory.simplefactory.noodles.INoodles;
    
    public class Test {
        public static void main(String[] args) {
            INoodlesFactory noodlesFactory = new LzINoodlesFactory();
            INoodles noodles = noodlesFactory.createNoodles();
            noodles.desc();
        }
    }
    
    

    代码实例:
    设计模式demo

  • 相关阅读:
    centos crash debug
    go get Unknown SSL protocol error in connection to gopkg.in
    Tensorflow serving with Kubernetes
    Spring 集成 Swagger UI
    Docker Registry V2 Garbage Collection
    Docker Registry V2 with Nginx
    Zabbix磁盘性能监控
    Zabbix CPU utilization监控参数
    Windows挂载Gluster复制卷
    Redis持久化存储(三)
  • 原文地址:https://www.cnblogs.com/liuyj-top/p/13091394.html
Copyright © 2011-2022 走看看