工厂模式,属于创建型设计模式,需要生成的对象叫做产品,生成对象的地方叫做工厂
简单工厂模式
举个例子
创建一个面条基类(或者接口)这是产品的抽象类
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();
特点:
1.它是一个具体的类,非接口抽象类。有一个重要的create()方法,利用if或者switch创建产品并返回
2.create()方法通常是静态的,所以也称之为静态工厂
缺点
1.扩展性差,比如我要多一种面条,就要去新增一个面条产品类,需要修改工厂类方法
优点
1.利用了多态性不管什么具体产品都返回抽象产品,即不用一个一个面条去new,再去调用desc方法
2.利用了封装性,内部产品发生变化时外部使用者不会受到影响
工厂方法模式
普通工厂就是把简单工厂中具体的工厂类,划分成两层:抽象工厂层+具体的工厂子类层
面条工厂(抽象工厂类),作用就是生产面条
public abstract class NoodlesFactory {
public abstract INoodles create();
}
拉面工厂(具体子类)
public class LzFactory extends NoodlesFactory {
@Override
public INoodles create() {
return new LzNoodles();
}
}
泡面工厂(具体子类)
public class PaoFactory extends NoodlesFactory {
@Override
public INoodles create() {
return new PaoNoodles();
}
}
干扣面工厂(具体子类)
public class GankouFactory extends NoodlesFactory {
@Override
public INoodles create() {
return new GankouNoodles();
}
}
使用的时候
NoodlesFactory factory1 = new GankouFactory();
INoodles gk3 = factory1.create();
gk3.desc();
普通工厂和简单工厂模式的区别
做出来的产品要抽象,工厂也应该要抽象
工厂方法使一个产品类的实例化延迟到具体工厂子类
好处就是当需要变化时,只需要增删响应的类,不需要修改已有的类
而简单工厂需要修改工厂的create()方法,多方法静态工厂模式需要增加一个静态方法
缺点就是,如果我们需要每次新增一个产品类,也要新增一个具体工厂类。