工厂模式
工厂模式

使命
工厂模式的出现是为了解决接口选择问题,当我们明确不同条件下创建不同实例时,可以选择工厂模式来创建实例。
优点
- 1、调用者想创建对象只需知道其名称即可,不用关心创建细节
- 2、拓展性高
- 3、屏蔽创建实现,调用者只需关心接口
缺点
- 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
造车工厂
下面我们将通过一个实例来体验一下工厂模式的应用,需求背景是一个卖车中介知道了一个超级工厂,这个工厂能创建各种车型,只需要中介把车型告诉给工厂就能造出来。我们将通过代码来实现这一场景
卖车中介
public class Client {
public static void main(String[] args) {
VehicleFactory factory = new VehicleFactory();
IVehicle benz = factory.product("BENZ");
benz.whistle();
benz.drive();
System.out.println("-------------------------------");
IVehicle audi = factory.product("AUDI");
audi.whistle();
audi.drive();
System.out.println("-------------------------------");
IVehicle bmw = factory.product("BMW");
bmw.whistle();
bmw.drive();
}
}
汽车接口
public interface IVehicle {
/**
* 鸣笛
*/
void whistle();
/**
* 行驶
*/
void drive();
}
奥迪汽车
public class Audi implements IVehicle {
@Override
public void whistle() {
System.out.println("奥迪在鸣笛......");
}
@Override
public void drive() {
System.out.println("奥迪在行驶......");
}
}
宝马汽车
public class BMW implements IVehicle {
@Override
public void whistle() {
System.out.println("宝马在鸣笛......");
}
@Override
public void drive() {
System.out.println("宝马在行驶......");
}
}
奔驰汽车
public class Benz implements IVehicle {
@Override
public void whistle() {
System.out.println("奔驰在鸣笛......");
}
@Override
public void drive() {
System.out.println("奔驰在行驶......");
}
}
汽车超级工厂
public class VehicleFactory {
public IVehicle product(String name){
IVehicle vehicle = null;
if ("BENZ".equals(name)){
vehicle = new Benz();
}else if("BMW".equals(name)){
vehicle = new BMW();
}else if ("AUDI".equals(name)){
vehicle = new Audi();
}
return vehicle;
}
}

经验之谈
- 工厂作为一种创建类模式,在需要生成复杂对象的地方都可以使用,但是如果是简单能用new可以完成创建对象就不必用上工厂模式了,这会增加系统维护的复杂度。
工厂模式其实和策略模式很相似,工厂模式着重于创建的过程,只要把创建的对象交给调用者就完成使命了,而策略模式是要选择不同的策略,并且调用具体的接口方法。可以说工厂方法实现到下面就已经达到效果了
public static void main(String[] args) { VehicleFactory factory = new VehicleFactory(); IVehicle benz = factory.product("BENZ"); IVehicle audi = factory.product("AUDI"); IVehicle bmw = factory.product("BMW"); }