工厂模式

工厂模式

通过“对象创建”绕开new,避免new对象导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象后的第一步工作 。

tips
  • 工厂模式:将创建对象引起的变化关到工厂的笼子里

  • 工厂模式并不会消除变化,而是集中管理由创建对象所带来的变化

例子

假如,公司在为A超市设计商业智能软件
需要完成:

  • 1.获取数据
  • 2.建模
  • 3.展示

于是项目完成后主要代码如下:


public class BusinessIntelligence {
    public static void main(String[] args) {
        //获取数据
        DataManagerA DMA = new DataManagerA();
        Data data = DMA.getData();
        //训练模型
        Model modelA = new Model(data);
        modelA.train();
        Data presentData = modelA.predict();
        //web展示
        Presentor presentor = new Presentor(presentData);
        presentor.present();
    }
}

后来因为市场反响好,好几家公司都要买公司的产品,你发现只需改获取数据代码就能轻松完成需求。于是对于B、C公司你分别改成了。

B公司

DataManagerB DMB = new DataManagerB();
Data data = DMB.getData();

C公司

DataManagerC DMC = new DataManagerC();
Data data = DMC.getData();

分别建立新项目,很轻松就搞定了。直到模型团队说要修改模型,你发现必须到A,B,C 三个项目下改动,而且随着客户的增加,改动的重复工作量也越来越多,分散各处的代码越来越不利于维护

总结原因,DataManager改动所造成的影响被扩散了。更严重的是,由于一时偷懒,你让他扩散到了整个项目

为了不让影响扩散,首先会想到,把公共的行为抽象成接口:

DataManagerInterface dm = new DataManagerInterface ()

虽然保证了赋值语句左边的代码稳定了,但抽象但接口是不能创建的。
new DataManagerInterface ()
于是就想,是否可以用一个函数返回

pubic DataManagerInterface getDataManager (){
	return new new DataManagerC()
}
DataManagerInterface dm = getDataManager();

由于这个函数的实现会随着公司的不同而不同,这是变化,千万不能留在本类中,最好是找个地方集中管理起来。

于是就得到了

DMFacotry f;
DataManagerInterface dm = f.getDataManager();

这时由于创建所带了的变化,被工厂类管理起来了。,新增一个客户D,程序员实现D的DataManagerD,然后把DataManagerD通过Factory的接口传递给BusinessIntelligence对象。

此时BusinessIntelligence类中代码稳定了下来,变化被放到了工厂类的具体实现中

总结

工厂模式就是用来管理由创建所带来改动,把这些改动关到工厂的笼子里

  • 没有工厂模式前,程序员为每个公司维护来一分项目代码,一有改动很难处理。
  • 引入工厂模式后,数据获取方式变化后,只需要业务同事实现具体的工厂类,并传给BusinessIntelligence即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值