工厂模式
核心
- 实例化对象不使用new,用工厂方法代替
- 将选择实现类,创建对象统一管理和控制,从而将调用者根我们的实现类解耦。
简单工厂
只有一个简单的工厂类,由该工厂类负责对象的创建。
示例
首先定义一个Car接口
public interface Car{
void name();
}
再定义两个实现了该接口的类
public class Benz implements Car{
@Override
public void name() {
System.out.println("Benz");
}
}
public class Bmw implements Car{
@Override
public void name() {
System.out.println("Bwm");
}
}
接着编写简单工厂的工厂类
public class CarFactory {
public static Car getCar(String brand){
if(brand.equals("Benz")){
return new Benz();
}else if (brand.equals("Bmw")){
return new Bmw();
}else
return null;
}
}
最后是消费者使用工厂类创建对象的代码
public static void main(String[] args) {
Car benz = CarFactory.getCar("Benz");
benz.name();
}
因为是静态方法,所以使用起来很方便,看起来就像是工厂拿到了一个对象一样。
局限性:当我们需要重新创建一个名为Audi的对象时,我们会修改工厂类,即使把创建对象的判断解耦成单独的方法,我们也需要加上新建Audi对象的方法。
结论:简单工厂违背开闭原则
工厂方法
核心:把实例化的操作推迟到子类
首先改变CarFactory 只给他纯粹的一个功能,就是创建车对象,不表明是具体的哪种车
public interface CarFactory {
Car getCar();
}
接着编写不同车的车工厂类(实现CarFactory接口即可),这时如果有新的品牌车过来,拓展写一个新的品牌工厂类即可,不要要在原有代码上进行更改,所以工厂方法符合开闭原则。
public class BenzFactory implements CarFactory{
@Override
public Car getCar() {
return new Benz();
}
}
public class BmwFactory implements CarFactory{
@Override
public Car getCar() {
return new Bmw();
}
}
最后创建对象的代码也需要更改
public class Consumer {
public static void main(String[] args) {
Car benz = new BenzFactory().getCar();
benz.name();
}
}
抽象工厂(应用较少)
用于创建对象家族
因为在阅读se的源码的时候没怎么遇到,所以这里就不分析了。