工厂模式

工厂模式

核心

  • 实例化对象不使用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的源码的时候没怎么遇到,所以这里就不分析了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值