工厂模式
git demo地址:https://github.com/Gdk666/Design-Pattern-Demo/tree/master/src/Factory
属于创建型设计模式,需要生成的对象叫做产品,生成对象的地方叫做工厂。
使用场景:
在任何需要生成复杂对象的地方,都可以使用工厂方法模式。
直接用new可以完成的不需要用工厂模式。
一丶简单(静态)工厂模式
产品的抽象类
public abstract class INoodles {
/*
*
* 描述每种面条啥样的
*/
public abstract void desc();
}
具体产品类
public class LzNoodles extends INoodles {
@Override public void desc() {
System.out.println("兰州拉面 上海的好贵 家里才5 6块钱一碗");
}
}
public class PaoNoodles extends INoodles {
@Override public void desc() {
System.out.println("泡面好吃 可不要贪杯");
}
}
工厂类
public class SimpleNoodlesFactory {
public static final int TYPE_LZ = 1;//兰州拉面
public static final int TYPE_PM = 2;//泡面
public static INoodles createNoodles(int type) {
switch (type) {
case TYPE_LZ: return new LzNoodles();
case TYPE_PM: return new PaoNoodles();
}
}
}
mian
/** * 简单工厂模式 */
INoodles noodles = SimpleNoodlesFactory.createNoodles(SimpleNoodlesFactory.TYPE_LZ);
noodles.desc();
特点
1 它是一个具体的类,非接口 抽象类。有一个重要的create()方法,利用if或者 switch创建产品并返回。
2 create()方法通常是静态的,所以也称之为静态工厂。
缺点
1 扩展性差(我想增加一种面条,除了新增一个面条产品类,还需要修改工厂类方法)
2 不同的产品需要不同额外参数的时候 不支持。
二丶多方法工厂
多方法的工厂模式为不同产品,提供不同的生产方法,使用时 需要哪种产品就调用该种产品的方法,使用方便、容错率高,多增加一个产品只要在工厂内静态方法。
例如:线程池 Executor类
public class MulWayNoodlesFactory {
/**
* 模仿Executors 类
* 生产泡面
*
* @return
*/
public static INoodles createPm() {
return new PaoNoodles();
}
/**
* 模仿Executors 类
* 生产兰州拉面
*
* @return
*/
public static INoodles createLz() {
return new LzNoodles();
}
}
main
INoodles lz2 = MulWayNoodlesFactory.createLz();
lz2.desc();
三丶枚举非静态方法实现工厂方法模式
/**
* @ClassName Guoz
* @Data 9:57
* @Version 1.0
**/
public enum SimpleFactory {
pig{
public Animal create(){
return new PigAnimal();
}
},
Dog{
public Animal create(){
return new DogAnimal();
}
};
public abstract Animal create();
}
main
/**
* @ClassName Guoz
* @Data 10:05
* @Version 1.0
* 枚举非静态方法实现工厂方法模式
**/
public class mian {
public static void main(String[] args) {
Animal animal = SimpleFactory.pig.create();
animal.Kind();
}
}
优点:
-
避免错误调用的发生
-
性能好,使用便捷,枚举类型的计算是以int类型的计算为基础。
-
降低耦合度
源码撑腰环节
查看java源码:java.util.concurrent.Executors类便是一个生成Executor 的工厂 ,其采用的便是 多方法静态工厂模式:
例如ThreadPoolExecutor类构造方法有5个参数,其中三个参数写法固定,前两个参数可配置,如下写。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
又如JDK想增加创建ForkJoinPool类的方法了,只想配置parallelism参数,便在类里增加一个如下的方法:
public static ExecutorService newWorkStealingPool(int parallelism) {
return new ForkJoinPool
(parallelism,
ForkJoinPool.defaultForkJoinWorkerThreadFactory,
null, true);
}
这个例子可以感受到工厂方法的魅力了吧:方便创建 同种类型的 复杂参数 对象。
具体使用的方法也可以看看:设计模式-策略模式与工厂模式的在项目中的结合使用