工厂 顾名思意 就是用来生产产品的。
通过工厂模式,我们可以减少使用new 的操作。而转而调用工厂帮我们生产对象。
实现 生产者 与调用者的分离。
下面 我们来用实例来写一下三种工厂模式
假设 我们现在去买车。
简单工厂模式
车有不同的型号。
所以 我们给它一个接口
车接口
public interface Car {
void name();
}
不同的车实现这个接口
Tesla
public class Tesla implements Car {
@Override
public void name() {
System.out.println("Tesla");
}
}
五菱宏光
public class Wuling implements Car {
@Override
public void name() {
System.out.println("五菱宏光");
}
}
我们去买车,不是直接去原厂地要 而是找工厂。
生产车的工厂。
public class CarFactory {
public static Car getCar(String name){
//通过判断 输入的参数,从而造不同的车
if("五菱".equals(name)){
return new Wuling();
}else if("Tesla".equals(name)){
return new Tesla();
}else
return null;
}
}
现在我们去买车
public class Consumer {
public static void main(String[] args) {
//通过工厂的方法 代替我们手动new 的操作。
Car car = CarFactory.getCar("五菱");
Car tesla = CarFactory.getCar("Tesla");
car.name();
tesla.name();
}
}
结果
结构图
uml 图
简单的工厂模式 通过 判断输入的参数 而造不同的车。
而如果 我又要造 宝马 车,我就需要去改动 工厂的源代码。
这是 我们不想看到的。使用另外一种模式解决这个问题。
工厂方法模式。
工厂方法模式
既然 有新车。 那工厂直接不生产车,交给具体的厂商去生产。
将工厂也进行一层封装
具体的代码会是这样
同样会有车接口。
但会增加 特定的工厂与 工厂接口。
工厂接口
public interface CarFactory {
Car getCar();
}
Tesla 工厂
public class TeslaFactory implements CarFactory{
@Override
public Car getCar() {
return new Tesla();
}
}
五菱工厂
public class WulingFactory implements CarFactory{
@Override
public Car getCar() {
return new Wuling();
}
}
现在我们去拿车 就直接去不同的工厂里要了。
public class Consumer {
public static void main(String[] args) {
Car car = new TeslaFactory().getCar();
Car car1 = new WulingFactory().getCar();
car.name();
car1.name();
}
}
而现在 如果我们要 去买宝马车 。就不需要 修改工厂的代码。直接 实现工厂接口就可以了。 然后去找宝马工厂拿车。
具体会是这样
Car bmw = new BMWFactory().getCar();
bmw.name();
结构图
新增的宝马车。
uml 图
这种模式,我们的代码量一下子多了很多。
我们接着说下一种工厂模式。
抽象工厂模式
刚才都是生产同一系列产品,车子。如果要生产不同类型的产品,
比如 华为 有 手机 也有路由器,小米也有手机,也有路由器
那该咋办?
抽象工厂 能够解决这种问题。
简单的讲 就是又增加了一层封装。
同样以实例来说明。
手机接口
public interface IPhoneProduct {
void start();//开机功能
}
路由器接口
public interface IRouterProduct {
void openWifi();//打开wifi 功能
}
产品工厂接口
public interface IProductFacory {
//接口 抽象的产品工厂。
//生产手机
IPhoneProduct iphoneProduct();
//生产路由器
IRouterProduct irouterProduct();
}
不同的厂商分别实现接口
小米实现 手机 路由器 工厂实现
public class XiaomiPhone implements IPhoneProduct {
@Override
public void start() {
System.out.println("小米开机中");
}
}
public class XiaomiRouter implements IRouterProduct {
@Override
public void openWifi() {
System.out.println("小米路由器打开wifi");
}
}
public class XiaoMiFactory implements IProductFacory {
@Override
public IPhoneProduct iphoneProduct() {
return new XiaomiPhone();
}
@Override
public IRouterProduct irouterProduct() {
return new XiaomiRouter();
}
}
华为 实现接口
public class HuaweiPhone implements IPhoneProduct {
@Override
public void start() {
System.out.println("华为开机中");
}
}
public class HuaweiRouter implements IRouterProduct {
@Override
public void openWifi() {
System.out.println("华为路由器打开wifi");
}
}
public class HuaweiFactory implements IProductFacory {
@Override
public IPhoneProduct iphoneProduct() {
return new HuaweiPhone();
}
@Override
public IRouterProduct irouterProduct() {
return new HuaweiRouter();
}
}
客户端 去使用
public class Client {
public static void main(String[] args) {
IPhoneProduct iPhoneProduct = new HuaweiFactory().iphoneProduct();
iPhoneProduct.start();//华为开机中
IRouterProduct iRouterProduct = new XiaoMiFactory().irouterProduct();
iRouterProduct.openWifi();//小米路由器打开wifi
}
}
uml 图
结构图
在这里,我们要理解那个IProductFacory 它实际上是封装的封装。抽象的抽象。因为 它里面的也是接口。
如果 我现在 要再造一台电脑的话 只要 在 IProductFacory添加一个电脑的接口,然后 让各大厂商实现就行了。
产品接口 只关注 某一类产品。而产品工厂 关注有哪些产品进行了两层封装。
如果产品持续变动较大的话,不建议使用抽象工厂模式。 都需要重写接口。
本文 主要讲了三种工厂模式,以及简单的实现。
如果对你有帮助,还请点个👍。
有疑问,请在评论区留言哦!