Java设计模式之工厂模式
一、什么是工厂模式
1.1 工厂模式简介
在面向对象编程中,想要构造一个对象的实例,通常是使用new关键字来实例化。但是在某些情况下,直接new对象会产生一些问题。比如实例对象需要遵循先后顺序,你可能先需要获取另个对象的值传递给构造参数进行实例。而工厂模式设计初衷就是将对象初始化与对象调用分开,如果多处地方需要实例化某对象,并且共用接口相同时,可以通过工厂方法模式进行创建。在前期架构代码时可能需要多花点时间去完成,但是代码结构清晰明了,对于以后的维护升级,业务扩展带来极大的时间、人力上的减少
1.2 工厂模式的三种基础角色:
抽象角色
具体角色
工厂角色(PS: 在抽象工厂模式种,工厂角色拆分为:抽象工厂角色、具体工厂角色)
1.3 工厂模式可分为三类:
PS: 一般是采用抽象工厂模式,但是学习阶段可了解下其他两种,下面三种逐步抽象
1.3.1 简单工厂模式(Simple Factory Method)
别名静态工厂方法模式,通过传递参数给工厂类来判断实例化某个对象。被创建的实例一般继承于同一个父类
1.3.2 工厂方法模式(Factory Method)
通过在工厂方法中提供多个函数来返回对象实例化
1.3.3 抽象工厂模式(Abstract Facory Method)
比工厂方法模式更加抽象,一个抽象工厂可以派生出多个具体工厂。抽象接口中的抽象角色可以不同,但一般是一类产品。那么抽象角色不同就可以决定业务的多样性,也体现了JAVA的多态特性,在业务扩展方面更加灵活。虽然工厂方法模式也是可以实现,但是在代码构建上会过于混乱,后期维护时阅读代码上会不方便。我们可以试着想一想,一类产品如果需要进行业务扩展,那么抽象角色增加,减少一般是不太可能,顶多代码冗余。因为程序一般是闭包原则,在产品成型后一般不会去改动底层接口。话说回来,抽象角色的增加,那么我们在扩展一类产品时就可以新添加抽象接口类,而不去改动原来的代码,这在代码架构、后期阅读都是极好的
二、应用场景举例及代码实现
用奔驰与宝马的开车与停车业务抽象进行模拟练习
2.1 简单工厂模式
// 抽象角色(车的行为)
public abstract class Cars {
/** 开车 **/
public abstract void Start();
/** 停车 **/
public abstract void Stop();
}
// 具体角色(奔驰车)
public class Benz extends Cars{
@Override
public void Start() {
// TODO Auto-generated method stub
System.out.println("[Benz] Start");
}
@Override
public void Stop() {
// TODO Auto-generated method stub
System.out.println("[Benz] Stop");
}
}
//具体角色(宝马车)
public class BMW extends Cars{
@Override
public void Start() {
// TODO Auto-generated method stub
System.out.println("[BMW] Start");
}
@Override
public void Stop() {
// TODO Auto-generated method stub
System.out.println("[BMW] Stop");
}
}
// 工厂角色
public class CarsFactory {
/** 根据参数返回不同对象实例 **/
public static Cars getCar(String carName) {
switch (carName) {
case "Benz" :
return new Benz();
case "BMW" :
return new BMW();
default:
System.out.println("[CarsFactory] getCar default");
break;
}
return null;
}
}
public class Main {
public static void main(String[] args) {
Cars carBmw = CarsFactory.getCar("BMW");
carBmw.Start();
Cars carBenz = CarsFactory.getCar("Benz");
carBenz.Stop();
}
}
运行结果:
[BMW] Start
[Benz] Stop
[Benz] Stop
2.2
工厂方法模式
实现上与简单工厂模式主要区别在于工厂类
// 工厂角色
// 通过添加多个函数,返回某个对象实例
public class CarsFactory {
public static Cars getBenzCar() {
return new Benz();
}
public static Cars getBMWCar() {
return new BMW();
}
}
public class Main {
public static void main(String[] args) {
Cars benzCar = CarsFactory.getBenzCar();
benzCar.Stop();
Cars bmwCar = CarsFactory.getBMWCar();
bmwCar.Start();
}
}
运行结果:
[Benz] Stop
[BMW] Start
[BMW] Start
2.3 抽象 工厂模式
实现上与简单工厂模式、工厂方法模式都略有不同,设计是把工厂类分为:抽象工厂、具体工厂。抽象工厂负责工厂实例化对象的接口规范,具体工厂负责返回实例化对象。
// 抽象工厂角色
public abstract class CarsAbFactory {
public abstract Cars getBenz();
public abstract Cars getBMW();
}
// 工厂具体角色
public class CarsFactory extends CarsAbFactory{
@Override
public Cars getBenz() {
// TODO Auto-generated method stub
return new Benz();
}
@Override
public Cars getBMW() {
// TODO Auto-generated method stub
return new BMW();
}
}
public class Main {
public static void main(String[] args) {
CarsFactory cfBenz = new CarsFactory();
Cars benz = cfBenz.getBenz();
benz.Start();
CarsFactory cfBmw = new CarsFactory();
Cars bmw = cfBmw.getBMW();
bmw.Start();
}
}
运行结果:
[Benz] Start
[BMW] Start
[BMW] Start