作用 | 实现创建者与调用者的分离 |
---|---|
详细分类 | 简单工厂模式 、工厂方法模式 、抽象工厂模式 |
涉及原则 | 开闭原则 、 依赖倒转原则 、迪米特法则 |
核心本质:
三种模式介绍:
简单工厂模式:用来生产同一等级结构中的任意产品(对于增加新的产品,需要扩展已有代码)
工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)
抽象工厂模式:围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
分类 | 内容 |
---|---|
简单工厂模式 (静态工厂模式) | 虽然某种程度上不符合设计原则,但实际使用最多 |
工厂方法模式 | 满足开闭原则,不修改已有类的前提下,通过增加新的工厂实现扩展 |
抽象工厂模式 | 不可以增加新产品,可以增加产品族 |
应用场景 | 1.JDK的Calendar中getInstance方法 2.JDBC中Connection对象的获取 3.Spring中IOC容器创建管理bean对象 4.反射中Class对象的newInstance方法 |
// ---------- 接口 ----------
public interface Car {
public void name();
}
// ---------- 两个实现类: ----------
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉");
}
}
public class Wuling implements Car {
@Override
public void name() {
System.out.println("五菱宏光");
}
}
/* ---------- 简单工厂模式,又称静态工厂模式 ----------
缺点:不满足开闭原则。如果新增一个车型(大众),则车工厂需要改代码
*/
public class CarFactory {
//简单工厂方法一:
public static Car getCar(String carName){
if(carName.equals("五菱")){
return new Wuling();
}else if(carName.equals("特斯拉")){
return new Tesla();
}else{
return null;
}
}
//简单工厂方法二:
public static Car getWuling(){
return new Wuling();
}
public static Car getTesla(){
return new Tesla();
}
}
// ---------- 消费者 ----------
public class Consumer {
public static void main(String[] args) {
Car wuling = CarFactory.getCar("五菱");
Car tesla = CarFactory.getCar("特斯拉");
wuling.name(); //输出:五菱宏光
tesla.name(); //输出:特斯拉
}
}
在使用的时候,要是新增了一个车类型,我们就需要重新修改原有的代码:与设计思想违背,所以就提出了下面的设计模式。
// ---------- 接口 ----------
public interface Car {
public void name();
}
// ---------- 两个实现类: ----------
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉");
}
}
public class Wuling implements Car {
@Override
public void name() {
System.out.println("五菱宏光");
}
}
/* ---------- 方法工厂模式:每个实现类,分别创建一个工厂 ----------
优点:满足开闭原则,新增一个车型,不用修改原代码
缺点:代码量明显增加
*/
public interface CarFactory {
public Car getCar();
}
//特斯拉工厂,只生产特斯拉
public class TeslaFactory implements CarFactory {
@Override
public Car getCar() {
return new Tesla();
}
}
//五菱工厂,只生产五菱
public class WulingFactory implements CarFactory {
@Override
public Car getCar() {
return new Wuling();
}
}
// ---------- 消费者:通过特定的工厂,生产特定的车 ----------
public class Consumer {
public static void main(String[] args) {
Car wuling = new WulingFactory().getCar();
Car tesla = new TeslaFactory().getCar();
wuling.name(); //输出:五菱宏光
tesla.name(); //输出:特斯拉
}
}
对比项 | 结果 |
---|---|
结构复杂度 | 简单工厂模式,更简单 |
代码复杂度 | 简单工厂模式,更简洁 |
编程复杂度 | 简单工厂模式,更容易 |
管理复杂度 | 简单工厂模式,更易管理 |
开闭原则 | 简单工厂模式,不满足 方法工厂模式,满足 |
根据设计原则,应采用工厂方法模式 根据实际业务,简单工厂模式,应用更广泛
评论
登录后才可以进行评论哦!