大家一直都在找的Java工厂模式面试题

一.简单(静态)工厂模式

1,首先建立一个产品的抽象类

需要生产什么产品(实例对象)就需要首先建立一个相应产品的抽象类

class="hljs java has-numbering">class="hljs-keyword">public class="hljs-keyword">abstract class="hljs-class">class="hljs-keyword">class class="hljs-title">INoodles {
    class="hljs-javadoc">/**
     * 描述每种面条啥样的
     */
    class="hljs-keyword">public class="hljs-keyword">abstract class="hljs-keyword">void class="hljs-title">desc();
}

2.再建立几种具体的产品类如:

这里建立了三个产品类:兰州拉面,泡面,干扣面(没吃过)

class="hljs java has-numbering">class="hljs-keyword">public class="hljs-class">class="hljs-keyword">class class="hljs-title">LzNoodles class="hljs-keyword">extends class="hljs-title">INoodles {
    class="hljs-annotation">@Override
    class="hljs-keyword">public class="hljs-keyword">void class="hljs-title">desc() {
        System.out.println(class="hljs-string">"兰州拉面");
    }
}
class="hljs java has-numbering">class="hljs-keyword">public class="hljs-class">class="hljs-keyword">class class="hljs-title">PaoNoodles class="hljs-keyword">extends class="hljs-title">INoodles {
    class="hljs-annotation">@Override
    class="hljs-keyword">public class="hljs-keyword">void class="hljs-title">desc() {
        System.out.println(class="hljs-string">"泡面");
    }
}
class="hljs java has-numbering">class="hljs-keyword">public class="hljs-class">class="hljs-keyword">class class="hljs-title">GankouNoodles class="hljs-keyword">extends class="hljs-title">INoodles {
    class="hljs-annotation">@Override
    class="hljs-keyword">public class="hljs-keyword">void class="hljs-title">desc() {
        System.out.println(class="hljs-string">"干扣面");
    }
}

3.在建立完这些产品后就可以建立(造面的)工厂了:

工厂里面包含了我们可以生产的产品(面)

class="hljs java has-numbering">class="hljs-keyword">public class="hljs-class">class="hljs-keyword">class class="hljs-title">SimpleNoodlesFactory {
    class="hljs-keyword">public class="hljs-keyword">static class="hljs-keyword">final class="hljs-keyword">int TYPE_LZ = class="hljs-number">1;class="hljs-comment">//兰州拉面
    class="hljs-keyword">public class="hljs-keyword">static class="hljs-keyword">final class="hljs-keyword">int TYPE_PM = class="hljs-number">2;class="hljs-comment">//泡面
    class="hljs-keyword">public class="hljs-keyword">static class="hljs-keyword">final class="hljs-keyword">int TYPE_GK = class="hljs-number">3;class="hljs-comment">//干扣面

    class="hljs-keyword">public class="hljs-keyword">static INoodles class="hljs-title">createNoodles(class="hljs-keyword">int type) {
        class="hljs-keyword">switch (type) {
            class="hljs-keyword">case TYPE_LZ:
                class="hljs-keyword">return class="hljs-keyword">new LzNoodles();
            class="hljs-keyword">case TYPE_PM:
                class="hljs-keyword">return class="hljs-keyword">new PaoNoodles();
            class="hljs-keyword">case TYPE_GK:
            class="hljs-keyword">default:
                class="hljs-keyword">return class="hljs-keyword">new GankouNoodles();
        }
    }
}

4.开始根据客人的要求生产产品

如下代码是生产干扣面(真心不知道这名字是怎么来的)的过程。

INoodles noodles = SimpleNoodlesFactory.createNoodles(SimpleNoodlesFactory.TYPE_GK);
 noodles.desc();

该设计模式只可以生产工厂能生产的产品,如需要增加产品,需要在工厂类中增加相应的静态变量。

特点

1 它是一个具体的类,非接口 抽象类。有一个重要的create()方法,利用if或者 switch创建产品并返回。

2 create()方法通常是静态的,所以也称之为静态工厂。

缺点

1 扩展性差(我想增加一种面条,除了新增一个面条产品类,还需要修改工厂类方法)

2 不同的产品需要不同额外参数的时候 不支持。

二、另一种简单工厂(反射):

利用反射Class.forName(clz.getName()).newInstance()实现的简单工厂:

class="hljs java has-numbering">class="hljs-keyword">public class="hljs-class">class="hljs-keyword">class class="hljs-title">StaticNoodlesFactory {
    class="hljs-javadoc">/**
     * 传入Class实例化面条产品类
     *
     *class="hljs-javadoctag"> @param clz
     *class="hljs-javadoctag"> @param 
     *class="hljs-javadoctag"> @return
     */
    class="hljs-keyword">public class="hljs-keyword">static  T class="hljs-title">createNoodles(Class clz) {
        T result = class="hljs-keyword">null;
        class="hljs-keyword">try {
            result = (T) Class.forName(clz.getName()).newInstance();
        } class="hljs-keyword">catch (Exception e) {
            e.printStackTrace();
        }
        class="hljs-keyword">return result;
    }
}

特点

1.它也是一个具体的类,非接口 抽象类。但它的create()方法,是利用反射机制生成对象返回,好处是增加一种产品时,不需要修改create()的代码。

缺点

这种写法粗看牛逼,细想之下,不谈reflection的效率还有以下问题:

1.个人觉得不好,因为Class.forName(clz.getName()).newInstance()调用的是无参构造函数生成对象,它和new Object()是一样的性质,而工厂方法应该用于复杂对象的初始化 ,当需要调用有参的构造函数时便无能为力了,这样像为了工厂而工厂。

2.不同的产品需要不同额外参数的时候 不支持

以上就是“大家一直都在找的Java工厂模式面试题”,你能回答上来吗?如果想要了解更多的相关内容,可以点击Java面试题

你可能感兴趣的:(java,servlet,jvm)