设计模式-简单工厂

Posted bateman6988

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-简单工厂相关的知识,希望对你有一定的参考价值。

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

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

        

         其示意性代码如下:

  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();
    }

}

 

以上是关于设计模式-简单工厂的主要内容,如果未能解决你的问题,请参考以下文章

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式-简单工厂工厂方法模式抽象工厂模式详解

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

设计模式之简单工厂模式

C#之三十八 简单工厂设计模式