您的位置:首页 > 其它

二 工厂方法模式

2016-04-26 20:58 162 查看

工厂方法模式

定义:

定义一个创建产品类实例的工厂接口,而实际类实例的创建由继承自工厂接口的子类实现。核心工厂类不再负责具体类实例的创建,这样核心工厂类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口。意义:进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的类实例。

角色:

抽象工厂角色

->工厂方法模式的核心,任何工厂类都必须实现这个接口。

具体工厂角色

->具体工厂类是抽象工厂的一个实现,负责实例化类实例。

抽象角色

->工厂方法模式所创建的所有类实例的父类,它负责描述所有对象所共有的公共接口。

具体类角色

->工厂方法模式所创建的具体类实例对象 。

工厂方法模式和简单工厂模式比较

1、结构上,工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。

2、工厂方法模式之还叫多态性工厂模式,原因是具体工厂类都有共同的接口,或者有共同的抽象父类。

3、当系统扩展需要添加新的类实例对象时,仅仅需要添加一个具体对

象,并实现一个具体工厂对象,原有工厂对象不需要进行任何修改,很好的符合了“开放-封闭”原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。

代码讲解

以上一章节介绍的例子讲解。

抽象工厂角色

public interface FruitFactory {
public Fruit getFruit();
}


具体工厂角色

因为有两种水果apple和banana,所有需要两个具体工厂,用于创建该两种水果。

分为为:

public class AppleFactory implements FruitFactory {
public Fruit getFruit() {
return new Apple();
}
}


public class BananaFactory implements FruitFactory {
public Fruit getFruit() {
return new Banana();
}
}


抽象角色

public interface Fruit {
public void get();
}


具体类角色

public class Apple implements Fruit{
public void get(){
System.out.println("Apple");
}
}


public class Banana implements Fruit{
public void get(){
System.out.println("Banana");
}
}


到目前为止,还有最后一个问题,就是当添加新类的时候,该如何扩展?假如,我们再添加一个水果Pear。

按照上面的讲解,应该首先添加一个Pear的具体工厂类,如下:

public class PearFactory implements FruitFactory {
public Fruit getFruit() {
return new Pear();
}
}


具体类角色,如下:

public class Pear implements Fruit {
public void get() {
System.out.println("Pear");
}
}


是不是,很简单就实现了新类的扩展。

那么,该如何调用呢,请看:

public class MainClass {
public static void main(String[] args) {
//获得AppleFactory
FruitFactory af = new AppleFactory();
Fruit apple = af.getFruit();
apple.get();

//获得BananaFactory
FruitFactory bf = new BananaFactory();
Fruit banana = bf.getFruit();
banana.get();

//获得PearFactory
FruitFactory pf = new PearFactory();
Fruit pear = pf.getFruit();
pear.get();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  实例 设计模式