一.简单(静态)工厂模式
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面试题