您的位置:首页 > 其它

常见设计模式之【工厂模式】

2011-12-19 11:46 471 查看
简介

工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类:

1. 简单工厂模式(Simple Factory)

2. 工厂方法模式(Factory Method)

3. 抽象工厂模式(Abstract Factory)

这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。下面是使用工厂模式的两种情况:

1.在编码时不能预见需要创建哪种类的实例。

2.系统不应依赖于产品类实例如何被创建、组合和表达的细节

例子:

如果生活中有两种灯一种是灯泡,另一种是灯管,它们都有个方法发亮shine(),有两个人,一个人会做灯泡,一个人会做灯管,他们两个各自做各自的。如果我要订两批灯一批是灯泡一批是灯管的话。那我要分别派人去找两个人分别谈判、沟通两次,再分别派人取货,但有一天我派去取货的人喝醉了,去做灯泡的人那里去要灯管,又去做灯管的人那里取灯泡,这样可就出错了。后来这两个人合做开了一家灯工厂,拥有两条生产线,这个工厂能同时造灯泡和灯管,那我只需与这家工厂谈判一次就可以了,也只需派人来这个工厂的销售部取货就可以了。当然销售部不能只销售灯泡,也不能只销售灯管,是二者都销售,根据订单不同销售的内容也不同。

一、简单工厂模式

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

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

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

abstract class Light{
  public abstract void shine();
}
class BulbLight extends Light{
  public void shine(){
   	System.out.println("Bulb Light is shine");
  }
}

class TubeLight extends Light{
  public void shine(){
   System.out.println("Tube Light is thrn on"); 
  }
}

class SimpleFactory{
public static Light creator(String name){
    if(name.equal("Bulb")){
         return new BulbLight();
    }else if(name.equal("Tube")){
         return new TubeLight();
    }
}
}
public class Test{
 public static void main(String[] args){
    SimpleFactory sf=new SimpleFactory();
    Light bulb=sf.creator("Bulb");
    bulb.shine();
    Light tube=sf.creator("Tube");
    tube.shine();
 }
}

二、工厂方法模式

1>抽象工厂角色:Light中这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现

2>具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。

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

3>具体产品角色:bulb和tube具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

public class Test{
 public static void main(String[] args){
    IFactoryLight factory =new FactoryLight();
    Light light=factory.createLight("BulbLight");
    light.shine();
 }
}

interface IFactoryLight{  
	public Light createLight(String name);
}
class FactoryLight implements IFactoryLight{
   @Override
   public Light createLight(String name){
        if(name.equals("BulbLight")){
	    return new BulbLight();	
	}else if(name.equals("TubeLight")){
	    return new TubeLight();	
	}  
		return null;
   }
}

interface Light{
  public void shine();
}
class BulbLight implements Light{
  public void shine(){
   	System.out.println("Bulb Light is shine");
  }
}

class TubeLight implements Light{
  public void shine(){
   	System.out.println("Tube Light is shine"); 
  }
}


三、抽象工厂模式

例子:

如果上面例子中要生产一种新产品-探照灯,那就得把原来的两条生产线进行大的修改,生产完成后再把生产线改回来,这样就太影响工作了,于是他们想出了一个方法再建一条生产线,专门生产探照灯。

1>抽象工厂角色:Creator是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

2>具体工厂角色:BulbCreator与TubeCreator这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

3>抽象产品角色:Light工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。

4>具体产品角色:bulb和tube这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应

/**
 * 抽象工厂模式
 * @author potter
 */
public class Test{
 public static void main(String[] args){
	BulbFactory bulbFactory=new BulbFactory();
	TubeFactory tubeFactory=new TubeFactory();
    BulbLight bulb=(BulbLight) bulbFactory.create();
    bulb.shine();
    TubeLight tube=(TubeLight) tubeFactory.create();
    tube.shine();
 }
}

interface Light{
  public abstract void shine();
}
class BulbLight implements Light{
  public void shine(){
   	System.out.println("Bulb Light is shine");
  }
}

class TubeLight implements Light{
  public void shine(){
   	System.out.println("Tube Light is shine"); 
  }
}

abstract class Factory{
  public abstract Light create();
}

class BulbFactory extends Factory{
  public Light create(){
     return new BulbLight();
  }
}

class TubeFactory extends Factory{
  public Light create(){
     return new TubeLight();
  }
}


这是我对工厂模式在java中的理解,欢迎各位来点评,指正说的不准确或者有误的地方,也欢迎大家对说的不全来进行补充

参考文章:

http://baike.baidu.com/view/1306799.htm

http://hi.baidu.com/grayworm/blog/item/4a832160f8c9de46eaf8f8c1.html

http://blog.csai.cn/user1/25929/archives/2009/35622.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: