首页 > 编程知识 正文

工厂模式 设计原则,工厂方法模式

时间:2023-05-06 07:55:11 阅读:247280 作者:4646

工厂方法模式 一、模式定义

工厂方法模式(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(); }}

参考代码效果更好哦

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。