您的位置:首页 > 编程语言 > Java开发

实例探索Java模式之路——工厂方法模式

2017-04-30 15:06 337 查看
工厂方法模式
1、工厂方法模式是类的创建模式,又叫虚拟构造子模式或者多态性工厂模式。
工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际的创建工作推迟到子类中。

2、工厂方法模式是对简单工厂模式的进一步抽象和推广,由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,克服了它的缺点。
在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做。
而核心类则成了一个抽象工厂角色,仅仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化。
这种进一步抽象的结果,使得工厂模式方法可以允许系统在不修改具体工厂角色的情况下引进新的产品。

3、工厂方法模式结构



抽象工厂角色:这个角色是工厂方法模式的核心,他是与应用程序无关的。任何在模式中创建对象的工厂必须实现这个接口。
具体工厂角色:这个角色是实现了抽象工厂接口的具体Java类。具体工厂角色含有与应用程序密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
抽象产品角色:工厂方法模式所创建对象的超类型,也是产品对象的共同父类或共同拥有的接口。
具体产品角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。

4、工厂方法模式相图



工厂方法模式中,只有一个产品等级结构,但是有多个具体工厂分别对不同的产品负责。后面还有多个产品等级结构以及多个工厂的,对于产品等级结构以及产品簇的知识我们后续再了解,这里先有个认识,用处不大。真正有用的地方是在抽象工厂模式中,那里我们在详谈。

5、工厂方法模式与简单工厂模式:
工厂方法模式的核心是一个抽象工厂类,简单工厂模式把核心放在一个具体类上。

工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综合。
工厂方法模式退化后可以变得像简单工厂模式。

如果确定一个系统只需要一个具体工厂类,那么就把抽象工厂合并到具体的工厂类中,由于只有一个工厂类,所以不妨把工厂方法改为静态方法,这就变成了简单工厂模式。
如果系统需要加入一个新的产品类,需要向系统加入这个产品类以及它所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂或者其他的具体工厂角色。

对于增加新的产品而言,这个系统完全支持开—闭原则。

6、抽象工厂角色和抽象产品角色都可以选择由Java接口或者Java抽象类来实现。

7、通过一个工厂方法模式例子深入理解:这样设计保证彼此的产品互相不关联

产品抽象类:

/**
* 农村水果必须实现的接口
*/
public interface Fruit {
// 生长
void grow();

// 收获
void harvest();

// 种植
void plant();
}
产品具体类:

public class Apple implements Fruit {

private int treeAge;

@Override
public void grow() {
System.out.print("Apple is growing!");
}

@Override
public void harvest() {
System.out.print("Apple is harvested!");
}

@Override
public void plant() {
System.out.print("Apple is planted!");
}

// 辅助方法
public static void log(String msg) {
System.out.print("Apple is msg!");
}

// apple的年龄
public int getTreeAge() {
return treeAge;
}

public void setTreeAge(int treeAge) {
this.treeAge = treeAge;
}

}

public class Grape implements Fruit {

private boolean seedless;

@Override
public void grow() {
System.out.print("Grape is growing!");
}

@Override
public void harvest() {
System.out.print("Grape is harvested!");
}

@Override
public void plant() {
System.out.print("Grape is planted!");
}

// 辅助方法
public static void log(String msg) {
System.out.print("Grape is msg!");
}

// Grape的种子类型
public boolean isSeedless() {
return seedless;
}

public void setSeedless(boolean seedless) {
this.seedless = seedless;
}

}

public class Strawberry implements Fruit {

@Override
public void grow() {
System.out.print("Strawberry is growing!");
}

@Override
public void harvest() {
System.out.print("Strawberry is harvested!");
}

@Override
public void plant() {
System.out.print("Strawberry is planted!");
}

// 辅助方法
public static void log(String msg) {
System.out.print("Strawberry is msg!");
}

}

抽象工厂类:

public interface IFruitGardener {
// 工厂方法
public Fruit factory();
}

具体工厂类:

import IFruit.Fruit;
import IFruit.Fruitimpl.Apple;
import IFruitGardener.IFruitGardener;

public class AppleGardener implements IFruitGardener  {

public Fruit factory() {
return new Apple();
}

}

import IFruit.Fruit;
import IFruit.Fruitimpl.Grape;
import IFruitGardener.IFruitGardener;

public class GrapeGardener implements IFruitGardener {

@Override
public Fruit factory() {
// TODO Auto-generated method stub
return new Grape();
}

}

import IFruit.Fruit;
import IFruit.Fruitimpl.Strawberry;
import IFruitGardener.IFruitGardener;

public class StrawberryGardener implements IFruitGardener {

@Override
public Fruit factory() {
// TODO Auto-generated method stub
return new Strawberry();
}

}

客户端调用:

package client;

import IFruitGardenerimpl.AppleGardener;

//苹果客户端调用

public class Appleclient {
public static void main(String[] args) {

AppleGardener applegardener = new AppleGardener();
applegardener.factory().grow();
applegardener.factory().harvest();
applegardener.factory().plant();
}
}

package client;

import IFruitGardenerimpl.GrapeGardener;

//葡萄客户端调用
public class Grapeclient {
public static void main(String[] args) {

GrapeGardener grapegardener = new GrapeGardener();
grapegardener.factory().grow();
grapegardener.factory().harvest();
grapegardener.factory().plant();

StrawberryGardener strawberrygardener = new StrawberryGardener();
strawberrygardener.factory().grow();
strawberrygardener.factory().harvest();
strawberrygardener.factory().plant();
}
}

package client;

import IFruitGardenerimpl.StrawberryGardener;

//草莓客户端调用
public class Strawberryclient {
public static void main(String[] args) {

StrawberryGardener strawberrygardener = new StrawberryGardener();
strawberrygardener.factory().grow();
strawberrygardener.factory().harvest();
strawberrygardener.factory().plant();
}
}

通过此实例,相信对该模式有了进一步的认识。

每天努力一点,每天都在进步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息