设为首页 - 加入收藏 焦点技术网
热搜:java
当前位置:首页 >

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

导读: 简介工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类:1. 简单工厂模式(Simple Factory)2. 工厂方法模式(Factory Method)3. 抽象工厂模式(Abstract Factory)这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。下面是使用工厂模式的两种情况:1.在...。。。
 

简介

工厂模式主要是为创建对象提供了接口。工厂模式按照《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>具体工厂角色BulbCreatorTubeCreator这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

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

(编辑: aa4790139)

网友评论
相关文章