1. 工厂模式概述
在工厂模式中,创建对象不会对外界暴露创建逻辑,而是通过使用一个共同的接口来获取新创建的对象。
在工厂模式中,不需要外界手动创建一个实例,而是通过调用对象工厂的方法,返回该类的实例。
比如我现在想获取一个产品,我只需要调用这个产品的工厂的方法就可以了。
(1) 适用情况
需要根据不同的条件,创建不同的实例对象时,可以考虑使用工厂模式。
(2) 优点
- 对于调用者来说,不必关心实例的创建方式,这样可以屏蔽产品的具体实现
- 拓展性高,如果需要增加一个产品,只需要拓展一个工厂类就可以
(3) 缺点
如果产品过多,则工厂类也会过多,增加了系统的复杂度。
2. 工厂模式实例
现在我们需要一个汽车工厂,用来创建不同品牌的汽车对象。
(1) 先声明一个汽车接口
public interface Car {
void declare();
}
(2) 创建各个品牌汽车的实现类
public class Benz implements Car{
@Override
public void declare() {
System.out.println("我是一辆奔驰。");
}
}
public class BMW implements Car{
@Override
public void declare() {
System.out.println("我是一辆宝马。");
}
}
public class Audi implements Car{
@Override
public void declare() {
System.out.println("我是一辆奥迪。");
}
}
(3) 创建汽车工厂
public class CarFactory {
/**
* 生产汽车
*
* @param brand 汽车品牌
* @return 汽车
*/
public Car buildCar(CAR_BRAND brand) {
switch (brand) {
case BENZ:
return new Benz();
case BMW:
return new BMW();
case AUDI:
return new Audi();
default:
return null;
}
}
}
enum CAR_BRAND {
BENZ,
BMW,
AUDI
}
(4) 使用汽车工厂生产汽车
public class FactoryDemo {
public static void main(String[] args) {
CarFactory carFactory = new CarFactory();
// 生产一辆奔驰
Car benz = carFactory.buildCar(CAR_BRAND.BENZ);
benz.declare();
// 生产一辆宝马
Car bmw = carFactory.buildCar(CAR_BRAND.BMW);
bmw.declare();
// 生产一辆奥迪
Car audi = carFactory.buildCar(CAR_BRAND.AUDI);
audi.declare();
}
}
运行结果:
3. 一些思考
现在我们的工厂已经能生产三种品牌的汽车了,但是为了支持国产,我们还要生产比亚迪、小鹏等。
此时我们只需要创建它们对应的类,然后稍微调整下工厂就好了。
有人可能会说,看起来工厂模式和直接new感觉区别没那么大啊?
那是因为我们的工厂简化了生产过程而已,正常生产汽车时不得生产底盘、悬挂、车身、座椅等等等等,难道这些都要我们自己手动去实现吗。而有了工厂,我们就只需要一个方法就够了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。