简单工厂模式又叫静态工厂方法模式,是有一个工厂对像决定创建出哪一种产品类的实例。

      简单工厂模式的简略类图如下:

        

         其示意性代码如下:

  1 public interface Product{}  

  

1 public class ConcreteProduct implements Product{
2 
3       public ConcreteProduct(){}      
4 
5 }

 

1  public class Creator {
2            public static Product factor(){
3          return new ConcreateProduct ();
4     }
5 }

       从上面的类图可以看出,简单工厂模式涉及到三个角色,工厂类角色,抽像产品角色和具体产品角色

      A.工厂类角色:是该模式的核心,他与商业逻辑紧密相关,跟据商业逻辑产生具体的产品,一般情况下,有一个具体的JAVA类来实现

      B.抽像产品角色:是一个接口或者抽像类,具体产品类实现或者继承自该抽像产品角色。

      C.具体产品角色:有一个具体JAVA类来实现,静态工厂方法所创建的任何对像都是这个角色的实例。

 如现在有一个自动售货机,售货机可以销售物品,比如红茶和绿茶等,如下图所示

 

每个物品都有名字和价格等信息。

 

1.Goods :物品的抽像角色,每个物品都有名称和价格。

2. GreenTea  BlackTea: 绿茶和红茶,具体的物品,具体产品角色

3. AutoMachine: 自动售货机,售卖物品的工厂。

样例代码如:

 

package com.designpattern.simplefactory;

public interface Goods {
    public String getName();

    public Double getPrice();
}


public class GreenTea implements Goods {

    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return "GreenTea";
    }

    @Override
    public Double getPrice() {
        // TODO Auto-generated method stub
        return 5d;
    }

}

public class BlackTea implements Goods {

    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return "BlackTea";
    }

    @Override
    public Double getPrice() {
        // TODO Auto-generated method stub
        return 3d;
    }

}

public class AutoMachine {

    public static  Goods factory(String name) {
        if (name.equalsIgnoreCase("greenTea")) {
            return new GreenTea();
        } else if (name.equalsIgnoreCase("blackTea")) {
            return new BlackTea();
        } else {
            return null;
        }
    }

    
    public  static void main(String[] args) {
        Goods goods=AutoMachine.factory("greenTea");
        System.out.println(goods.getName());
        System.out.println(goods.getPrice());
        
    }
}

 

简单工厂模式还有如下几种变种的情况,如:

 1.当系统中可以确定具体产品只可能有一个时,那么就可以省略掉抽像角色,工厂角色直接返回具体产品,如下图示:

      

2.工厂角色也可以和抽像角色合并,如下图:

  

         JDK中的DateFormat类就是采用上了述方法

       

     DateFormat是一个抽像类,但他有一些静态的工厂方法,如getDateInstance() 、getDateInstance(int arg0)  ,这些静态工厂方法将会返回DateFormat的具体实现类的实例,如SimpleDateFormat的实例 。

    3.三角色合并,如下图:

    

    

public class ConcreteProduct{
   
     public ConcreteProduct(){}

     public static ConcreteProduct   factory(){

            retirm  new ConcreteProduct();
    }

}

 

posted on 2017-08-24 23:34  bateman6988  阅读(121)  评论(0编辑  收藏  举报