您的位置:首页 > 其它

设计模式——工厂方法模式

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、类将创建某对象的职责代理给一些帮助子类中的一个,并且你想要将哪一个子类作为代理的信息进行局部化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: