设计模式--工厂方法模式【创建型模式】
设计模式的分类
我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类:
- 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
- 结构型模式(7 种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
- 行为型模式(11 种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
设计模式系列文章传送门
设计模式的 7 大原则
设计模式–单例模式【创建型模式】
什么是工厂方法模式
工厂模式又叫做工厂方法模式,是一种创建型的模式,在父类提供一个创建对象的方法,允许子类决定实例化对象的类型,由子类来决定要实例化的是哪一个工厂类,工厂模式让创建对象的过程延迟到子类进行,同时也实现了调用者和实现类解耦,提高了系统的可扩展性和灵活性,这同时也是去掉众多 if else 的实现⽅式。
静态工厂方法模式
静态工厂模式通过一个工厂类来创建对象。
静态工厂方法案例
我们假设有小米、小鹏、未来三款车需要制造,车厂是根据起汽车名称来生产汽车的,当前场景可以抽象出如下类。
car 接口
定义了车名称的方法,代码如下:
public interface Car {
void carName();
}
XiaoMiCar 类
XiaoMiCar 实现了 Car 接口,代码如下:
public class XiaoMiCar implements Car{
@Override
public void carName() {
System.out.println("car name is xiaomi");
}
}
XiaoPengCar 类
XiaoPengCar 实现了 Car 接口,代码如下:
public class XiaoPengCar implements Car{
@Override
public void carName() {
System.out.println("car name is xiaopeng");
}
}
WeiLaiCar 类
WeiLaiCar 实现了 Car 接口,代码如下:
public class WeiLaiCar implements Car{
@Override
public void carName() {
System.out.println("car name is weilai");
}
}
CarFactory 生产车的工厂类
CarFactory 提供了一个根据车的名称生成 car 的类,代码如下:
public class CarFactory {
//根据 car name 创建 car 对象
public static Car createCarByName(String carName) {
if ("xiaomi".equals(carName)) {
return new XiaoMiCar();
} else if ("xiaopeng".equals(carName)) {
return new XiaoPengCar();
} else if ("weilai".equals(carName)) {
return new WeiLaiCar();
} else {
return null;
}
}
}
CarClient
生产 Car 的客户端类如下:
public class CarClient {
public static void main(String[] args) {
Car xiaomi = CarFactory.createCarByName("xiaomi");
xiaomi.carName();
Car xiaopeng = CarFactory.createCarByName("xiaopeng");
xiaopeng.carName();
Car weilai = CarFactory.createCarByName("weilai");
weilai.carName();
}
}
运行 CarClient 执行结果如下:
car name is xiaomi
car name is xiaopeng
car name is weilai
CarClient 类使用 CarFactory 创建出来的具体 Car 实例来实现 Car 的相关功能,这就是简单工厂模式。
可以看到静态工厂(简单工厂)模式代码实现简单,但是添加新的 Car 类型时候需要修改工厂类,对象的创建也是由工厂类来实现的。
工厂方法模式
工厂方法模式定义了一个用于创建对象的接口,让子类来决定实例化那个类。
Car
车产品属性定义接口如下:
public interface Car {
//汽车品牌
String getBrand();
//汽车创始人
String getFounder();
//汽车型号
String getModel();
//汽车颜色
String getColor();
}
CarFactory
车工厂接口定义如下:
public interface CarFactory {
//生产汽车接口
Car createCar();
}
有了车工厂定义接口,各个车品牌可以实现车工厂接口,也就是具体的车工厂实现类。
XiaoMiCarFactory
小米车工厂实现类如下:
public class XiaoMiCarFactory implements CarFactory{
@Override
public Car createCar() {
return new XiaoMiCar();
}
}
XiaoPengCarFactory
小鹏车工厂实现类如下:
public class XiaoPengCarFactory implements CarFactory{
@Override
public Car createCar() {
return new XiaoPengCar();
}
}
CarClient
车客户端如下:
public class CarClient {
public static void main(String[] args) {
XiaoMiCarFactory xiaoMiCarFactory = new XiaoMiCarFactory();
Car xiaoMiCar = xiaoMiCarFactory.createCar();
String brand = xiaoMiCar.getBrand();
String color = xiaoMiCar.getColor();
String founder = xiaoMiCar.getFounder();
String model = xiaoMiCar.getModel();
System.out.println(brand+"--"+founder+"--"+model+"--"+color);
XiaoPengCarFactory xiaoPengCarFactory = new XiaoPengCarFactory();
Car xiaoPengCar = xiaoPengCarFactory.createCar();
String xiaoPengBrand = xiaoPengCar.getBrand();
String xiaoPengColor = xiaoPengCar.getColor();
String xiaoPengFounder = xiaoPengCar.getFounder();
String xiaoPengModel = xiaoPengCar.getModel();
System.out.println(xiaoPengBrand+"--"+xiaoPengFounder+"--"+xiaoPengModel+"--"+xiaoPengColor);
}
}
我们使用小米车工厂类生产小米汽车,使用小鹏车工厂实现类生产小鹏汽车。
执行客户端代码,执行结果如下:
小米--雷布斯--su7--蓝色
小鹏--何小鹏--小鹏P7--炫酷黑
至此工厂方法模式已经实现完毕。
思考:工厂方法给我们带来了什么作用呢?
工厂方法的优缺点
优点
- 将对象的创建过程抽离出来,使得客户端代码可以清晰的表达自己的意图,且可以与具体的车产品类解耦,提高了代码的灵活性和可读性。
- 定义了统一的工厂类接口,新增车类型只需要,实现统一的工厂类接口即可,易于扩展。
- 每种车类型都有自己的实现类,新增、修改、删除某个车类型实现类,相互补影响,减少了软件测试成本。
缺点:
- 工厂方法模式需要客户端代码实例化具体的工厂对象,这在一定程度上会导致代码的复杂性和耦合性增加。
- 工厂方法模式会增加应用程序的类的数量,我们每增加一个车类型都需要为创建一个具体工厂。
总结:本篇分享了工厂方法模式的使用方法,其中也分析了简单工厂模式,希望可以帮助到有需要的朋友。
如有不正确的地方欢迎各位指出纠正。