简单易懂的工厂模式

工厂 顾名思意 就是用来生产产品的。
通过工厂模式,我们可以减少使用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添加一个电脑的接口,然后 让各大厂商实现就行了。

产品接口 只关注 某一类产品。而产品工厂 关注有哪些产品进行了两层封装。

如果产品持续变动较大的话,不建议使用抽象工厂模式。 都需要重写接口。

本文 主要讲了三种工厂模式,以及简单的实现。

如果对你有帮助,还请点个👍。

点赞点赞
有疑问,请在评论区留言哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值