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

  • 相关阅读:
    高放的c++学习笔记之函数基础
    高放的c++学习笔记之关联容器
    高放的c++学习笔记之lambda表达式
    二分图小结
    送给大一学弟学妹的几句话
    网络流小结
    后缀数组小结
    hdu5353
    UVALive 5792 Diccionário Portuñol
    概率dp小结
  • 原文地址:https://www.cnblogs.com/liuyj-top/p/13091394.html
Copyright © 2011-2022 走看看