一、简单工厂模式
举个例子:
我喜欢吃面条,抽象一个面条基类,(接口也可以),这是产品的抽象类。
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 GankouNoodles extends INoodles {
@Override
public void desc() {
System.out.println("油泼面好吃 6块一碗");
}
}
准备工作做完了,我们来到一家"简单面馆"(简单工厂类),菜单如下:
public class SimpleNoodlesFactory {
public static final int TYPE_LZ = 1;//兰州拉面
public static final int TYPE_PM = 2;//泡面
public static final int TYPE_GK = 3;//油泼面
public static INoodles createNoodles(int type) {
switch (type) {
case TYPE_LZ:
return new LzNoodles();
case TYPE_PM:
return new PaoNoodles();
case TYPE_GK:
default:
return new GankouNoodles();
}
}
}
简单面馆就提供三种面条(产品),你说你要什么,他就给你什么。
我点一份油泼面:
/**
* 简单工厂模式
*/
INoodles noodles = SimpleNoodlesFactory.createNoodles(SimpleNoodlesFactory.TYPE_GK);
noodles.desc();
输出:
油泼面好吃 6块一碗
特点
- 它是一个具体的类,非接口、抽象类。有一个重要的create()方法,利用 if 或者 switch创建产品并返回。
- create()方法通常是静态的,所以也称之为静态工厂。
缺点
- 扩展性差(我想增加一种面,除了新增一个面产品类,还需要修改工厂类方法)
- 不同的产品需要不同额外参数的时候 不支持。
二、工厂方法模式
1. 模式描述
提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。
2. 模式作用
可以一定程度上解耦,消费者和产品实现类隔离开,只依赖产品接口(抽象产品),产品实现类如何改动与消费者完全无关。
可以一定程度增加扩展性,若增加一个产品实现,只需要实现产品接口,修改工厂创建产品的方法,消费者可以无感知(若消费者不关心具体产品是什么的情况)。
可以一定程度增加代码的封装性、可读性。清楚的代码结构,对于消费者来说很少的代码量就可以完成很多工作。
另外,抽象工厂才是实际意义的工厂模式,工厂方法只是抽象工厂的一个比较常见的情况。
3. 适用场景
消费者不关心它所要创建对象的类(产品类)的时候。
消费者知道它所要创建对象的类(产品类),但不关心如何创建的时候。
例如:hibernate里通过sessionFactory创建session、

最低0.47元/天 解锁文章
1288





