简介
简单工程模式属于创建者模式,提供工厂方法代替new操作,这样我们在创建对象时不会对调用者暴露创建逻辑,并且使用同一个接口来创建接口对象。
优点
- 调用简单,只需要指定目标便可创建对象(目标就是指名称,类型等)
- 扩展简单,要增加一个产品,只需要扩展一个工厂类即可
- 屏蔽产品具体实现,调用者只关心产品接口。
缺点
- 不符合开闭原则,每次增加一个产品,都需要增加一个产品类和工厂方法,就不得不修改工厂类,使得工厂类过于复杂。
- 所有的创建逻辑处理都在工厂类中,但工厂类出了问题,整个系统就出了问题。
实现
先假设一个场景吧,最近长春长生的“疫苗”问题很受关注,有兴趣的百度一下,我们这里也不做评判,就拿疫苗来做个例子吧。
第一步:创建疫苗接口Vaccine
public interface Vaccine {
void efficacy();
}
第二步:创建具体的疫苗类
- 流感疫苗
public class InfluenzaVaccine implements Vaccine {
@Override
public void efficacy() {
System.out.println("预防流感");
}
}
- 狂犬病疫苗
public class RabiesVaccine implements Vaccine {
@Override
public void efficacy() {
System.out.println("预防狂犬病");
}
}
- 乙肝疫苗
public class HepatitisBVaccine implements Vaccine {
@Override
public void efficacy() {
System.out.println("预防乙肝");
}
}
第三步:创建一个工厂,生成基于给定信息的实体类的对象。
public class VaccineFactory {
public static final int TYPE_ERRO = -1;
public static final int TYPE_INFLUENZA = 0;
public static final int TYPE_RABIES = 1;
public static final int TYPE_HEPATITIS_B = 2;
//使用 getVaccine 方法获取指定的疫苗对象
public Vaccine getVaccine(int type){
if(type == TYPE_ERRO){
return null;
}
if(type == TYPE_INFLUENZA){
return new InfluenzaVaccine();
} else if(type == TYPE_RABIES){
return new RabiesVaccine();
} else if(type == TYPE_HEPATITIS_B){
return new HepatitisBVaccine();
}
return null;
}
}
第四步:使用该工厂获取实例
public class FactoryDemo {
public static void main(String[] args) {
VaccineFactory vaccineFactory = new VaccineFactory();
//获取 InfluenzaVaccine 的对象,并调用它的 efficacy 方法
Vaccine vaccine1 = vaccineFactory.getVaccine(VaccineFactory.TYPE_INFLUENZA);
//调用 InfluenzaVaccine 的 efficacy 方法
vaccine1.efficacy();
//获取 RabiesVaccine 的对象,并调用它的 efficacy 方法
Vaccine vaccine2 = vaccineFactory.getVaccine(VaccineFactory.TYPE_RABIES);
//调用 RabiesVaccine 的 efficacy 方法
vaccine2.efficacy();
//获取 HepatitisBVaccine 的对象,并调用它的 efficacy 方法
Vaccine vaccine3 = vaccineFactory.getVaccine(VaccineFactory.TYPE_HEPATITIS_B);
//调用 HepatitisBVaccine 的 efficacy 方法
vaccine3.efficacy();
}
}
第五步:执行结果
预防流感
预防狂犬病
预防乙肝
网友评论