大战设计模式【5】—— 工厂方法模式
工厂方法(Factory Method)模式
设计模式使用的例子
https://github.com/LinkinStars/DesignPatternsAllExample
一、定义
定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
工厂方法模式又简称为工厂模式,也可称为多态工厂模式,它是一种创建型模式。
二、结构
Product(抽象产品):定义产品的接口,是工厂方法模式所创建的对象的超类,也就是产品对象的公共父类。
ConcreteProduct(具体产品):它实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间一一对应。
Factory(抽象工厂):抽象工厂类,声明了工厂方法,用于返回一个产品。
ConcreteFactory(具体工厂):抽象工厂的子类,实现了抽象工厂中定义的工厂方法,并可由客户端调用,返回一个具体产品类的实例。
三、优点
工厂方法用于创建客户所需要的产品,还向客户隐藏了哪种具体产品类将被实例化这一细节。
因此,用户只需要关心所需产品对应的工厂,无须关心创建细节。
在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,也无须修改客户端,还无须修改其他的具体工厂和具体产品,
而只要加入一个具体工厂和具体产品就可以了。因此,系统的可扩展性得到了保证,符合开闭原则。
四、缺点
在添加新产品时,需要编写新的具体产品类,还要提供与之对应的具体工厂类,系统中类的个数将成对增加,一定程度上增加了系统的复杂度。
五、应用场景
客户端不知道其所需要的对象的类。
在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的的工厂即可,具体的产品对象由具体工厂创建,
可将具体工厂的类名存储到配置文件或数据库中。抽象工厂类通过其子类来指定创建哪个对象。
六、个人总结
1、用最白话的方式解释就是,工厂方法模式就是多个工厂的简单工厂模式。
2、好处是,使用时,我们可以决定使用的是哪一个工厂生产什么样的产品,当然不同的工厂生产的产品是不同的。
3、利用两个抽象的地方:
一个是产品的抽象,保证具体的产品一定有你需要的方法;
一个是工厂的抽象,保证具体的工厂能生产对应的产品;
参考博客:http://www.cnblogs.com/edisonchou/p/6696903.html