简单工厂(Simple Factory)
描述了一个类,它拥有一个包含大量条件语句的构建方法,可根据方法的参数来选择对何种产品进行初始化并将其返回。
- 通过静态方法(相对比较多)或实例方法创建对象
- 封装对象创建过程(基于条件的不同创建不同的具体产品)
应用场景分析
- JDBC(DriverManager.getConnection())
- Druid(getConnection()),DruidDataSource
- Mybatis(Configuration工厂类,newExecutor工厂方法)
角色分析
- 抽象产品对象(例如Executor,Connection,。。。),接口,抽象类,省略后可以用Object
- 具体产品对象(例如SimpleExecutor,DruidPooledConnection,。。。)
- 具体工厂对象(例如Configuration,。。。)
应用分析
- 优势:解耦(对象应用者与对象创建之间的耦合),简单
- 劣势:可扩展性相对较差(创建产品的对象的工厂方法不够灵活)
举个栗子
饮料接口
public interface Drinks {
void drink();
}
可乐类
public class Cola implements Drinks{
@Override
public void drink() {
System.out.println("drink Cola");
}
}
雪碧类
public class Sprite implements Drinks{
@Override
public void drink() {
System.out.println("drink Sprite");
}
}
抽象工厂类
静态方法
public class DrinkFactory {
public static Drinks createDrink(int number) {
switch (number) {
case 1:
return new Cola();
case 2:
return new Sprite();
default:
return null;
}
}
}
Demo
public class Demo {
public static void main(String[] args) {
int a=1;
int b=2;
DrinkFactory.createDrink(a).drink();
DrinkFactory.createDrink(b).drink();
}
}
结果
drink Cola
drink Sprite
区别
简单工厂 : 用来生产同一类产品(饮料)的固定产品(可乐、雪碧)。不能增加新的产品(如芬达)
工厂方法 : 用来生产同一类产品(汽车)的任意产品(宝马、奔驰。。。)。支持增加任意工厂(如奥迪工厂),增加任意产品(如奥迪)
抽象工厂 : 用来生产不同产品(电视、手机)的不同 系列(小米、华为)产品。不能增加新的产品类(如空调),支持增加产品系列(如苹果) ,支持增加系列工厂(如苹果工厂),支持增加产品(如苹果手机)