zoukankan      html  css  js  c++  java
  • java模式-工厂模式

    今天在学习工厂模式,从最简单的简单工厂模式开始。

    我们现在需要通过工厂Factory生产A,B两款产品(都是产品,实现了接口Product)。

    产品A:

    public class A implements Product {
    
        public A() {
            System.err.println("生产了产品A");
        }
    
    }

    产品B:

    public class B implements Product {
    
        public B() {
            System.err.println("生产了产品B");
        }
    
    }

    A,B实现的接口Product:

    public interface Product {
    
    }

    接下来就是我们用来实例化A,B的工厂类:

    public class Factory {
        public Product create(int i) throws Exception {
            switch (i) {
            case 1:
                return new A();
            case 2:
                return new B();
            default:
                throw new Exception("没有该产品。");
            }
        }
        
        public static void main(String[] args) throws Exception {
            Factory f=new Factory();
            f.create(1);
            f.create(2);
            f.create(3);
        }
    }

    简单工厂中只有一个工厂,这个工厂可以接收参数,并根据参数来决定返回什么样的实体。所有创建的工作都由该工厂完成。

    简单工厂有一个不方便的地方在于,当我们需要需要新增一种产品,比如产品C,这时候我们不仅需要新建C的实体类,还需要修改工厂类的方法。如果需要生产的产品足够多,我们工厂类则会显得十分复杂,各种判断。

    这时候我们就思考了,可不可以让一个工厂只生产一种产品呢,这样工厂类内部就简单了。

    如下,我们先定义一个借口Product,所有可以生产产品的工厂类都要实现这个接口。

    /**
     * <p>
     * 
     * 工厂类接口
     *       </p>
     *
     * @author wangchao
     *
     * @version 1.0.0
     *
     * @since 1.0.0
     *
     */
    public interface FactoryInterface {
        //创建方法
        public Product create();
    }

    实现了这个接口的工厂:

    /**
     * <p>
     * 工厂A,专门负责生产A类产品
     * </p>
     *
     * @author wangchao
     *
     * @version 1.0.0
     *
     * @since 1.0.0
     *
     */
    public class FactoryA implements FactoryInterface {
    
        @Override
        public Product create() {return new A();
        }
    
    }
    /**
     * <p>
     * 工厂B,专门负责生产B类产品
     * </p>
     *
     * @author wangchao
     *
     * @version 1.0.0
     *
     * @since 1.0.0
     *
     */
    public class FactoryB implements FactoryInterface {
    
        public Product create() {
            return new B();
        }
    
    }

    这样的话,每一个工厂的实现就非常简单了。但是这样还是有一个问题,我们需要为为一个产品创建一个工厂,如果我们的产品足够多,我们就得创建足够的工厂,这样肯定不是我们想要的。

    我们需要一个更加抽象的工厂,来实现有共同属性的产品的生产。

    比如,现在我们现在对A产品要生产两个型号:A-1、A-2,B产品也需要生产两个型号:B-1、B-2。如果按照上面的工厂方法,我们需要写四个

  • 相关阅读:
    Codevs 1038 一元三次方程求解 NOIP 2001(导数 牛顿迭代)
    Bzoj 3942: [Usaco2015 Feb]Censoring(kmp)
    Bzoj 1355: [Baltic2009]Radio Transmission(kmp)
    Bzoj 2242: [SDOI2011]计算器(BSGS)
    Cogs 1345. [ZJOI2013] K大数查询(树套树)
    Cogs 58. 延绵的山峰(st表)
    洛谷 P2251 质量检测(st表)
    洛谷 P3382 【模板】三分法(三分 二分)
    Hihocoder #1142 : 三分·三分求极值
    P1967 货车运输
  • 原文地址:https://www.cnblogs.com/wangchaoBlog/p/6138162.html
Copyright © 2011-2022 走看看