设计模式之工厂方法模式

工厂方法模式

一、模式定义

工厂方法模式(Factory Method Pattern)简称工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。
在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

上次说到简单工厂模式的缺点:工厂职责过重,只要添加一个产品就得大幅修改工厂,违反开闭原则。所以这个模式就为解决这个问题的!
我们写一个工厂接口,然后实现这个接口,一个产品实现一次,也就是说,到最后,一个工厂就生产一种产品。这样在新添加产品的时候就新实现一个工厂就好,符合开闭原则!

这里我用生产空调来举例:
海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) 。使用工厂方法模式描述该场景。

二、具体实现

首先我们通过类图来宏观了解一下:
在这里插入图片描述

(1)创建抽象工厂:Airfactory 抽象方法:productAir()暗指工厂实现类功能为生产空调。
(2)创建抽象产品:Air(空调) 抽象方法:producted()
(3)创建具体产品:HaierAir(海尔空调)和MideaAir (美的空调)实现抽象方法producted():这里可以输出一个信息,提示空调已生产或者正在使用,在后期控制台可以看。
(4)创建具体工厂:Haierfactory(海尔工厂)和Mideafactory(美的工厂) 用来生产各自的空调;
实现抽象方法:productAir() 返回类型是 Air(空调),各自工厂,返回的Air也不同。美的工厂返回MideaAir,海尔工厂返回HaierAir.

完成后,我们就可以利用不同的工厂生产不同的产品了,比如说要一个美的空调,我们就可以创建一个美的工厂,调用类方法生成一个美的空调。

client(客户端):
这里创建的是海尔工厂,所以将来调用producted(),输出信息一定是海尔空调的了,get到了吗
在这里插入图片描述
虽然,工厂方法模式解决了简单工厂模式的问题,但也出现了新的问题,那就是类的数量增多!一个产品一个工厂,如果产品少那也能接受,但是如果产品多,那么势必会造成类的数量过多,程序变复杂!
总结:
工厂方法模式优点:
(1)工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节。
(2)能够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。
(3)在系统中加入新产品时,完全符合开闭原则。
工厂方法模式缺点:
(1)系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销
(2)增加了系统的抽象性和理解难度

三、代码参考

client(客户端):

package factorymethod;

public class client {
    public static void main(String[] args){
        //产生一个抽象空调
        Air a;
        Airfactory factory = new Haierfactory();
        a = factory.productAir();
        a.producted();
    }
}

Air(抽象空调):

package factorymethod;

public interface Air {
    public void producted();
}

Airfactory(抽象工厂):

package factorymethod;

public interface Airfactory {
    public Air productAir();
}

HaierAir(海尔空调):

package factorymethod;

public class HaierAir implements Air{
    @Override
    public void producted() {
        System.out.println("海尔空调已生产!");
    }
}

MideaAir(美的空调):

package factorymethod;

public class MideaAir implements Air {
    @Override
    public void producted() {
        System.out.println("美的空调已生产!");
    }
}

Haierfactory(海尔工厂):

package factorymethod;

public class Haierfactory implements Airfactory {
    public Air productAir(){
        return new HaierAir();
    }
}

Mideafactory(美的工厂):

package factorymethod;

public class Mideafactory implements Airfactory {
    @Override
    public Air productAir() {
        return new MideaAir();
    }
}

参考代码效果更好哦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值