Java设计模式之工厂模式

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

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

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值