在之前写过工厂方法模式,主要作用是帮助我们实例化对象,模式中的"工厂",其实就是创建实例对象的时候,代替了我们一直习惯使用的new关键字。
采用工厂的形式创建实例,可以屏蔽实例化细节,对于实例化比较复杂或者生命周期应该集中管理的情况,会给系统带来更多的可扩展性和尽量少的修改量
- 简单工厂模式的优缺点
优点:
- 屏蔽产品的具体实现,客户端调用只关心产品的接口.
- 实现比较简单.
缺点:
- 增加产品,需要修改工厂类,不符合 开-闭(对扩展开放,对修改关系)原则
- 工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则
- 工厂方法的优缺点
优点:
- 继承了简单工厂模式的优点
- 符合开-闭原则
缺点:
- 增加产品,需要新添加工厂类,导致系统类的个数成对增加,在一定程度上增加系统的复杂性
- 抽象工厂模式
- 抽象工厂模式是在简单工厂模式和工厂方法模式的基础上衍生的一种创建型设计模式
- 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们的具体类
- 提供了一种称为产品族的单独工厂,客户端需要创建抽象工厂的具体实现,然后使用工厂作为接口来创建这一主题的具体对象。
- 客户端不需要知道抽象工厂的具体实现内部的工厂方法中获得的对象的具体类型,因为客户端仅使用这些对象的通用接口。
- 抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。
- 抽象工厂模式的用途
- 与工厂方法模式不同的是,工厂方法模式在增加一个具体产品时,需要增加对应的工厂类,但是抽象抽象工厂模式只需要新增一个类型的具体的产品时,才会新增工厂。
- 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有的工厂模式都很重要
- 系统中有多于一个产品族,而每次只使用其中某一产品族
- 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体的实现
- 抽象工厂模式中的角色
- AbstractFactory(抽象工厂): 用于声明生成抽象产品的方法
- ConcreateFactory(具体工厂): 实现了抽象工厂声明�的生成抽象产品的方法,生成一组具体产品,这些产品构成了一个产品族,每个产品都位于某个产品等级结构中
- AbstractProduct(抽象产品):为每种产品声明接口,在抽象产品中定义了产品的抽象业务方法
- Product(具体产品): 定义具体工厂生产的具体产品对象,实现抽象产品接口中定义的业务方法
- Demo
抽象产品类
public interface BenzCar {
//加油汽车
public void geaUp();
}
public interface TeslaCar {
//充电
public void charge();
}
具体产品类
public class BenzBusinessCar implements BenzCar {
@Override
public void geaUp() {
System.out.println("给寡人的奔驰商务车加最好的汽油");
}
}
public class BenzSportCar implements BenzCar {
@Override
public void geaUp() {
System.out.println("给寡人的奔驰跑车加最好的汽油");
}
}
public class TeslaBusinessCar implements TeslaCar {
@Override
public void charge() {
System.out.println("给寡人的特斯拉商务车充满电");
}
}
public class TeslaSportCar implements TeslaCar {
@Override
public void charge() {
System.out.println("给寡人的特斯拉跑车充满电");
}
}
抽象工厂类
public interface CarFactory {
BenzCar getBenzCar();
TeslaCar getTeslaCar();
}
具体产品工厂类
public class BusniessCarFactory implements CarFactory {
@Override
public BenzCar getBenzCar() {
return new BenzBusinessCar();
}
@Override
public TeslaCar getTeslaCar() {
return new TeslaBusinessCar();
}
}
public class SportCarFactory implements CarFactory {
@Override
public BenzCar getBenzCar() {
return new BenzSportCar();
}
@Override
public TeslaCar getTeslaCar() {
return new TeslaSportCar();
}
}
7. 开闭原则的倾斜性
- 当新增产品族时,工厂方法模式很好的支持了"开闭原则",对于新增产品族,只需要对应新增一个具体工厂即可,对已有的代码无需做任何修改
- 抽象工厂模式在增加新的产品等级结构时,需要修改所有的工厂角色,包括工厂类,在所有的工厂类中,都要增加生产新产品的方法,不能很好的支持"开闭原则"
写在最后
做一个灵魂和肉体分离的人,灵魂不受肉体的束缚,灵魂可以指挥肉体
网友评论