介绍
工厂模式是Java中最常用的设计模式之一,这种类型的设计模式数据创建型模式。
主要就是负责创建对象的,当我们使用new创建对象的时候会导致对该对象的耦合性很严重,当我们需要修改的时候需要对所有new的对象进行修改,违反了软件设计的开闭原则,当我们使用工厂来生产对象的时候,我们只需要和工厂打交道就可以了。
简单工厂模式
简单工厂都有哪几个角色:
- 抽象产品(Car)
- 具体产品(WuLingCar,DaZhongCar)
- 具体工厂(CarFactory )
- 产品使用者(SimplenessFactory )
使用时通过调用工厂的 getCar() 方法,传入指定参数返回对应对象
package factory;
public class SimplenessFactory {
public static void main(String[] args) {
Car wuling = CarFactory.getCar("wuling");
wuling.wheel();
Car dazhong = CarFactory.getCar("dazhong");
dazhong.wheel();
}
}
interface Car {
void wheel();
}
class WuLingCar implements Car {
@Override
public void wheel() {
System.out.println("五菱车装轮子");
}
}
class DaZhongCar implements Car {
@Override
public void wheel() {
System.out.println("大众车装轮子");
}
}
class CarFactory {
public static Car getCar(String name) {
if (name == null) {
return null;
}
if (name.equals("dazhong")) {
return new DaZhongCar();
} else if (name.equals("wuling")) {
return new WuLingCar();
}
return null;
}
}
就这样一个简单工厂就创建好了,但是这种方式创建的工厂是违反了开闭原则的,试想当我们需要新增一种车型的时候,是不是需要修改之前的代码?是的!
工厂方法模式
工厂方法模式都有哪几个角色:
- 抽象产品(Car)
- 具体产品(WuLingCar,DaZhongCar)
- 抽象工厂(CarFactory )
- 具体工厂(WuLingFactory,DaZhongFactory)
- 产品使用者(SimplenessFactory )
将工厂进行一层抽象,具体生产什么产品由子类决定。
和上面例子差不多,只不过这一层多了一层对工厂的抽象。
package factory;
public class SimplenessFactory {
public static void main(String[] args) {
Car wuling = new WuLingFactory().getCar();
Car dazhong = new DaZhongFactory().getCar();
wuling.wheel();
dazhong.wheel();
}
}
interface Car {
void wheel();
}
class WuLingCar implements Car {
@Override
public void wheel() {
System.out.println("五菱车装轮子");
}
}
class DaZhongCar implements Car {
@Override
public void wheel() {
System.out.println("大众车装轮子");
}
}
interface CarFactory {
Car getCar();
}
class WuLingFactory implements CarFactory {
@Override
public Car getCar() {
return new WuLingCar();
}
}
class DaZhongFactory implements CarFactory {
@Override
public Car getCar() {
return new DaZhongCar();
}
}
工厂方法模式无疑满足了开闭原则,当需要进行扩展的时候只需要继承实现抽象工厂类和抽象产品类,就可以进行使用了。
结论
无论是结构复杂度,代码复杂度,编程复杂度,管理复杂度,简单工厂无疑是优于工厂方法模式的。
虽然说我们根据设计原则我们应该选择工厂方法模式,但是实际业务中更多的时候使用的是简单工厂模式,因为工厂方法模式从各方面来讲复杂度要高于简单工厂模式。所以有时候并不非要满足所有原则,如果为了一个原则把一段程序设计的极其复杂,也是不好的。