Factory Method模式

6Factory Method模式

真相:Factory Method模式实际上是延缓对象的创建,而把创建延迟到工厂中,将模块与具体对象的依赖转换成抽象工厂和具体工厂的依赖。(即接口和抽象类的弱依赖关系)

 

.NET Framework  对此模式进行了改造。

 

例子:WebRequest对象的创建:子类:HttpWebRequest/FtpWebRequest

 

WebRequest webRequest =WebRequset.Create(“Http://www.baidu.com”);

 

对于上面的实现的情况,在增加子类是需要修改Create方法的代码。违背了对修改关闭、继承开启的原则。

 

运用工厂模式对每一个请求类型创建单独的工厂子类,转换为弱依赖关系。

 

彻底解耦的办法:

     创建请求类型与工厂子类的映射类WebRequsetPrefixElement

Internal class WebRequsetPrefixElement{

Public string Prefix;

Public IwebRequsetCreator Creator;

 

Public WebRequsetPrefixElement(String p, IwebRequsetCreatorc ){

This.Prefix=p;

Creator=c;

}

}

 

 

在初始化WebRequset对象时,加载(静态方法)此时已有的WebRequsetPrefixElement对象数组。

当增加子类时,调用子类注册方法Regist()将新的WebRequsetPrefixElement对象假如数组中。此时创建WebReqest对象时根据URL开头查找WebRequsetPrefixElement数组,得到相应的Creator并创建对应的工厂对象。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个很经典的工厂方法模式的应用案例。下面是一个基本的设计: 首先,我们需要定义一个电视机工厂接口,用于定义电视机工厂的基本行为: ```java public interface TVFactory { public TV produceTV(); } ``` 然后,我们需要定义不同品牌的电视机工厂,这些工厂都实现了上述接口,并负责生产对应品牌的电视机: ```java public class HaierFactory implements TVFactory { public TV produceTV() { return new HaierTV(); } } public class HisenseFactory implements TVFactory { public TV produceTV() { return new HisenseTV(); } } public class TCLFactory implements TVFactory { public TV produceTV() { return new TCLTV(); } } public class SkyworthFactory implements TVFactory { public TV produceTV() { return new SkyworthTV(); } } ``` 最后,我们需要定义一个客户端类,用于测试工厂方法模式实现: ```java public class Client { public static void main(String[] args) { TVFactory haierFactory = new HaierFactory(); TV haierTV = haierFactory.produceTV(); haierTV.play(); TVFactory hisenseFactory = new HisenseFactory(); TV hisenseTV = hisenseFactory.produceTV(); hisenseTV.play(); TVFactory tclFactory = new TCLFactory(); TV tclTV = tclFactory.produceTV(); tclTV.play(); TVFactory skyworthFactory = new SkyworthFactory(); TV skyworthTV = skyworthFactory.produceTV(); skyworthTV.play(); } } ``` 这样,我们就可以根据不同的品牌来创建对应的电视机工厂,并且在使用时只需要调用工厂的 `produceTV()` 方法即可获取对应品牌的电视机实例。如果需要新增品牌,只需要新增一个品牌对应的工厂类即可,无需修改原有代码,实现了系统的灵活性和可扩展性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值