设计模式——工厂方法模式
2016-02-25 17:45
302 查看
上篇文章讲到了简单工厂,简单工厂模式在扩展性方面比较差,所以我们这篇文章写下工厂方法模式,转发引用指明出处。
概括:工厂方法模式就是把工厂类模块化,抽象化简单工厂模式中的工厂类,让每一种具体的工厂对应每一种具体产品,每一个抽象工厂对应每一个抽象产品。
抽象工厂角色:接口或抽象类,负责具体产品角色的定义,及与客户端的交互。
具体工厂类角色:是具体产品类角色直接调用者。
抽象产品角色:接口或抽象类,负责具体产品角色的定义,及与客户端的交互。
具体产品角色:被工厂类创建的对象,也是实际操作对象。
UML关系图(图是我用画图工具画的,实在有点丑,不要介意):
UML关系图
故事比喻:工厂原来可以产毛衣和T恤,但如果其他的衣服形式多了,一个厂里面产的衣服种类就太多了,对厂的改造太麻烦,为此明确把原来的一个工厂分成两个工厂,单独生产毛衣和T恤。
1)先创建一个抽象产品类IClothes。
/**
* 抽象产品类
*/
public interface IClothes {
void productName();//衣服名称
}
2)再创建具体产品类毛衣Sweater和T恤TShirt。
/**
* 毛衣(具体的产品类)
*/
public class Sweater implements IClothes {
@Override
public void productName() {
Log.i("clothe","在下毛衣!");
}
}
/**
* T恤(具体的产品类)
*/
public class TShirt implements IClothes {
@Override
public void productName() {
Log.i("clothe", "在下T恤!");
}
}
3)抽象工厂角色可以为抽象类或接口,这里为接口INormalFactory
/**
* 抽象工厂角色
*/
public interface INormalFactory {
IClothes getClothes();
}
4)具体工厂类这里定义为毛衣工厂ImplNormalSweaterFactory和T恤工厂ImplNormalTshirtFactory。
/**
* 毛衣工厂类
*/
public class ImplNormalSweaterFactory implements INormalFactory{
@Override
public IClothes getClothes() {
return new Sweater();
}
}
/**
* T恤工厂类
*/
public class ImplNormalTshirtFactory implements INormalFactory {
@Override
public IClothes getClothes() {
return new TShirt();
}
}
5)如何调用:
private void initFactory() {
//T恤工厂
INormalFactory tshirtFactory=new ImplNormalTshirtFactory();
IClothes tshit=tshirtFactory.getClothes();
tshit.productName();
//毛衣工厂
INormalFactory sweaterFactory=new ImplNormalSweaterFactory();
IClothes sweater=sweaterFactory.getClothes();
sweater.productName();
}
优点:
符合了开发的”开闭原则”,可以不修改原来代码的情况下,添加多种产品;调用端不需要知道创建的细节。
缺点:
每加一个产品,都要去创建对应的工厂类,造成代码量变大,加大了代码复杂性。
适用场合:
1、客户端不用知道创建的是哪个子类。
2、一个类想要由自己的子类来定义某对象的创建过程。
3、类将创建某对象的职责代理给一些帮助子类中的一个,并且你想要将哪一个子类作为代理的信息进行局部化。
概括:工厂方法模式就是把工厂类模块化,抽象化简单工厂模式中的工厂类,让每一种具体的工厂对应每一种具体产品,每一个抽象工厂对应每一个抽象产品。
抽象工厂角色:接口或抽象类,负责具体产品角色的定义,及与客户端的交互。
具体工厂类角色:是具体产品类角色直接调用者。
抽象产品角色:接口或抽象类,负责具体产品角色的定义,及与客户端的交互。
具体产品角色:被工厂类创建的对象,也是实际操作对象。
UML关系图(图是我用画图工具画的,实在有点丑,不要介意):
UML关系图
故事比喻:工厂原来可以产毛衣和T恤,但如果其他的衣服形式多了,一个厂里面产的衣服种类就太多了,对厂的改造太麻烦,为此明确把原来的一个工厂分成两个工厂,单独生产毛衣和T恤。
1)先创建一个抽象产品类IClothes。
/**
* 抽象产品类
*/
public interface IClothes {
void productName();//衣服名称
}
2)再创建具体产品类毛衣Sweater和T恤TShirt。
/**
* 毛衣(具体的产品类)
*/
public class Sweater implements IClothes {
@Override
public void productName() {
Log.i("clothe","在下毛衣!");
}
}
/**
* T恤(具体的产品类)
*/
public class TShirt implements IClothes {
@Override
public void productName() {
Log.i("clothe", "在下T恤!");
}
}
3)抽象工厂角色可以为抽象类或接口,这里为接口INormalFactory
/**
* 抽象工厂角色
*/
public interface INormalFactory {
IClothes getClothes();
}
4)具体工厂类这里定义为毛衣工厂ImplNormalSweaterFactory和T恤工厂ImplNormalTshirtFactory。
/**
* 毛衣工厂类
*/
public class ImplNormalSweaterFactory implements INormalFactory{
@Override
public IClothes getClothes() {
return new Sweater();
}
}
/**
* T恤工厂类
*/
public class ImplNormalTshirtFactory implements INormalFactory {
@Override
public IClothes getClothes() {
return new TShirt();
}
}
5)如何调用:
private void initFactory() {
//T恤工厂
INormalFactory tshirtFactory=new ImplNormalTshirtFactory();
IClothes tshit=tshirtFactory.getClothes();
tshit.productName();
//毛衣工厂
INormalFactory sweaterFactory=new ImplNormalSweaterFactory();
IClothes sweater=sweaterFactory.getClothes();
sweater.productName();
}
优点:
符合了开发的”开闭原则”,可以不修改原来代码的情况下,添加多种产品;调用端不需要知道创建的细节。
缺点:
每加一个产品,都要去创建对应的工厂类,造成代码量变大,加大了代码复杂性。
适用场合:
1、客户端不用知道创建的是哪个子类。
2、一个类想要由自己的子类来定义某对象的创建过程。
3、类将创建某对象的职责代理给一些帮助子类中的一个,并且你想要将哪一个子类作为代理的信息进行局部化。
相关文章推荐
- 无限循环treeview
- HDU 2553 n皇后问题
- Java垃圾回收工作原理
- LoadRunner录制回放脚本RecContentType=application/json报错
- asp.net时间 日期(DateTime) 的格式处理
- Repository模式
- ActionBar
- 详解Linux中文件的特殊权限:SGID、SUID、SBIT
- tabu_search
- div动态元素自适应高度
- 20个JS优化代码技巧
- 彻底理解js中this的指向,不必硬背。
- Java 网络编程(四) InetAddress类
- js对数组按顺序排序
- 【云计算】docker前世今生
- android简单实例--------普通菜单optionMenu,上下文菜单ContextMenu,弹出式菜单的使用PopuMenu(三)
- OpenCV 剪切矩形区域
- 恩布企业IM PC端,私有云服务端发布 1.19 版本
- js观察者模式简单实现
- 【JavaWeb Structs2学习】OGNL表达式