工厂模式
目录
为什么要使用工厂模式
工厂模式是一种创建型的设计模式,专门用于创建对象,通过工厂模式创建对象我们就不需要手动创建对象了,直接重工厂类里面获取即可。
工厂方法主要有如下几个优点:
- 隐藏了创建对象的复杂度,用户不需要知道如何创建对象,只需要调用相关的方法API即可创建对象,
- 降低了代码耦合,一旦我们需要修改创建对象的方式或则参数,如果不使用工厂模式直接new的话那么我们需要手动查找并且修改所有new的代码,而如果使用了工厂模式因为我们获取对象都是通过工厂获取的,我们只需要修改工厂类的相关代码即可
工厂模式实现方法
- 简单工厂
- 工厂方法模式
- 抽象工厂
简单工厂
简单工厂模式就是只有一个工厂,然后用户通过传入不同的名字或则参数,此工厂类再根据用户传入的参数进行判断需要创建哪个对象(被创建的实例具有相同的接口或则父亲,当然了,返回值直接设置成Object也是可以的)
简单工厂模式有如下几个缺点:
- 违背开闭原则(对扩展开放,对修改关闭),如果需要增加一个类则需要修改工厂类
- 工厂类只有一个,职责过重,逻辑复杂
interface Computer {
String Brand(); //品牌
}
public class MacComputer implements Computer {
public static final String BrandName = "Mac";
@Override
public String Brand() {
return BrandName;
}
}
public class LenovoComputer implements Computer {
public static final String BrandName = "Lenovo";
@Override
public String Brand() {
return BrandName;
}
}
public enum ComputerBrand {
Mac, Lenovo
}
创建计算机的简单工厂,根据传入的Type不同分别创建不同品牌的计算机,如果需要增加一种品牌则需要改动此部分代码,所以违背了 开闭原则
public class ComputerFactory {
public static Computer createComputer(ComputerBrand brand) {
switch (brand) {
case Mac:
return new MacComputer();
case Lenovo:
return new LenovoComputer();
default:
return null;
}
}
}
public static void main(String[] args) {
Computer mac = ComputerFactory.createComputer(ComputerBrand.Mac);
System.out.println(mac.Brand());
}
工厂方法
工厂方法和简单工厂的区别就是:
- 每个对象都有属于自己的工厂类,工厂类不再是一个了,并且有一个工厂类接口,如果增加一个类的话则只需要创建该类对应的工厂类继承工厂类接口即可,每个具体的工厂类只产生一个对应的实例对象
- 用户不是通过传入参数创建了,而是直接直接调用每个对象自己的工厂类的方法
下面只展示改动部分
工厂接口
interface ComputerFactory {
Computer createComputer(); //这里只有一个方法
}
创建Lenovo计算机和Mac计算机的工厂类,如果需要增加一种品牌的计算机则只需要再创建一个对应品牌计算机的工厂类即可而不需要改动代码,缺点就是每增加一种品牌计算机就需要增加一个对应的工厂类
public class LenovoComputerFactory implements ComputerFactory {
@Override
public Computer createComputer() {
return new LenovoComputer();
}
}
public class MacComputerFactory implements ComputerFactory {
@Override
public Computer createComputer() {
return new MacComputer();
}
}
public static void main(String[] args) {
Computer mac = new MacComputerFactory().createComputer();
Computer lenovo = new LenovoComputerFactory().createComputer();
}
抽象工厂
工厂方法需要为每个类都创建一个工厂,这样类一多那么就会产生很多工厂类,所以我们可以为同一类产品创建一个工厂即可,也就是分组一样