java设计模式之一 —— 工厂模式整理

最近把学过的设计模式重新整理一遍,工厂模式算是除单例之外最基础的一个设计模式。

工厂模式

在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化, 如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样。
先来看看它的组成:

     1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。

     2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

     3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

代码整理如下:

此时,则是为水果类声明了一个接口,表现在代码上:

1 public interface Fruit {
2 // 生长
3 void grow();
4 // 收获
5 void harvest();
6 // 种植
7 void plant();
8 }
9
10

水果接口规定出所有的水果必须实现的接口,包括任何水果类必须具备的方法plant(),grow(),和harvest();

Apple类是水果类的一种,因此它实现了水果接口所声明的所有方法。另处,由于苹果是多年生植物,因此多出一个treeAge性质,描述苹果的树龄。代码如下所示:
package fac;

public class Apple implements Fruit { // 通过implements实现接口Fruit
private int treeAge;

 public   void  grow() {
    log( " Apple is growing " );
} 

 public   void  harvest() {
    log( " Apple has been harvested " );
} 

 public   void  plant() {
    log( " Apple ha been planted " );
} 

 public   static   void  log(String msg) {
    System.out.println(msg);
} 

 public   int  getTreeAge() {
     return  treeAge;
} 

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

}

同理,葡萄 Grape:
package fac;

public class Grape implements Fruit{
private boolean seedless;
public void grow(){
log(“Grape is growing.”);
}

public void harvest(){
    log("Grape has been harvested");
}

public void plant(){
    log("Grape ha been planted");
}

public static void log(String msg){
    System.out.println(msg);
}

public boolean isSeedless() {
    return seedless;
}

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

}

草莓 Stuawberry:
package fac;

public class Strawberry implements Fruit{
public void grow(){
log(“Strawberry is growing”);
}

public void harvest(){
    log("Strawberry has been harvested");
}

public void plant(){
    log("Strawberry has been planted");
}

public static void log(String msg){
    System.out.println(msg);
}

}

农场园丁也是系统的一部分,由一个类来代表,FruitGardener类,代码如下:
package fac;

public class FruitGardener{
public static Fruit factory(String which)throws Exception{
if(which.equalsIgnoreCase(“apple”)){
return new Apple();
}else if(which.equalsIgnoreCase(“strawberry”)){
return new Strawberry();
}else if (which.equalsIgnoreCase(“grape”)){
return new Grape();
}else{
throw new Exception(“Bad fruit request”);
}
}
}
这时有人来果园玩,和园丁说,给我们介绍下你的水果吧。于是园丁:
package fac;

public class People {

public static void main(String[] args) throws Exception {
    FruitGardener fg=new FruitGardener();
    Fruit ap=fg.factory("Apple");
    ap.grow();
    Fruit gp=fg.factory("Grape");
    gp.plant();

    Fruit dd=fg.factory("ddd");//抛出Bad fruit request异常
}    

}

便于理解,再附上一张图片:

这里写图片描述






总结:工厂模式虽然为基础的一个设计模式,不过个人却认为并不意味着普遍。得按照具体情况而言是否适合用此设计模式。按照个人理解:工厂模式应该更适用于大项目(需要创建成百上千个对象),以此来达到统一管理对象的实例化的目的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章