工厂模式

什么是工厂模式?

一个功能,可能有不同的实现方法,因此我们把它抽象为一个接口,根据具体需求,编写许多个实现类。然后设计一个工厂,根据不同的条件,选择创建并返回我们具体需要的实现类对象。

为什么要用工厂模式?

工厂模式降低了对象构造之间的代码耦合,当我们更新接口的实现时,就不需要修改原来的代码,只需要修改工厂类的代码。

举个例子:
造一辆车,需要3个零件。我们自己造的话,那就要先 new 三个零件对象,然后作为构造函数的参数去 new 车的对象。假如说我们在很多地方造了车,当车的制造变为5个零件时,我们就必须修改所有造车的代码。

如果我们使用工厂来帮我们造车,我们只需要修改工厂里造车方法的代码,就可以达到更新的目的,而不需要修改每一处造车的代码。


简单工厂模式、工厂方法模式、工厂抽象模式

简单工厂模式

简单工厂模式中,工厂是根据静态的参数(不是说参数是static的,而是工厂方法有固定的参数类型、参数列表)来选择创建哪一个实现类,工厂方法就是通过多个 if-else 或者 switch 来选择。

// 1、抽象产品角色
Interface ICar{
    void show();
}

// 2、具体产品角色
class Benz() implements ICar{
    public void show(){
        System.out.println("这是一辆奔驰");
    }
}
class BMW() implements ICar{
    public void show(){
        System.out.println("这是一辆宝马");
    }
}

// 3、工厂角色
class CarFactory{
    public create(String type){
        if(type.equals("奔驰")){
            return new Benz();
        }else if(type.equals("宝马"){
            return new BMW();
        }else if(....){}
    }
}

当选择条件很多时,只能通过添加 if-else 或者 switch-case 来扩充生产方法,不利于代码的维护,因此只有条件不多的情况下,才采用这种设计模式。

工厂方法模式

工厂方法模式不再使用单一工厂类负责所有产品的创建,而是将工厂抽象为一个统一的接口,定义统一的生产方法,具体的产品创建交给工厂的实现类去完成。当有新的产品引进时,我们不需要修改已有的工厂类,只需要为新产品创建一个新的工厂实现类就可以了。

// 1、抽象产品角色
Interface ICar{
    void show();
}

// 2、具体产品角色
class Benz() implements ICar{
    public void show(){
        System.out.println("这是一辆奔驰");
    }
}
class BMW() implements ICar{
    public void show(){
        System.out.println("这是一辆宝马");
    }
}
...

// 3、抽象工厂角色
interface IFactory{
    ICar create(){}
}

// 4、具体工厂角色
class BenzFactory implements IFactory{
    public ICar create(){
        return new Benz();
    }
}
class BMWFactory implements IFactory{
    public ICar create(){
        return new BMW();
    }
}
...

工厂方法模式中,对产品的创建细节进行了封装,一个具体的工厂只对应一个具体的产品,不需要修改现有系统即可实现新产品的扩充,具有良好的灵活性和可扩展性。它的缺点在于,增加新产品的同时也需要增加新工厂,导致类的个数成对增长,一定程度上增加了系统的复杂度。

抽象工厂模式

抽象工厂模式的改进点在于一个工厂不止负责一个产品对象,而是生产多个产品对象。

抽象工厂模式引入了两个概念:
1. 产品等级结构:产品等级结构就是产品的继承结构,比如一个抽象类是汽车,那么奔驰啊、宝马啊、保时捷啊之类具体的的牌子就是子类,抽象类汽车和具体牌子之间就构成了一个产品等级结构。
2. 产品族:产品族是指由同一工厂生产的,不同产品等级结构的一组产品,比如奔驰工厂生产的GLC、SLC车型,GLC就属于SUV产品等级结构,SLC就属于跑车等级结构。

工厂方法模式一个具体工厂仅仅负责一个具体车型的生产,而抽象工厂模式则将有关联的一个产品族聚合在同一个工厂中,一个奔驰工厂可以生产奔驰牌的跑车、SUV、小轿车。




参考:

http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html

https://github.com/pzxwhc/MineKnowContainer/issues/73

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值