??xml version="1.0" encoding="utf-8" standalone="yes"?>三级黄视频在线观看,国产日产精品一区二区三区四区的观看方式,四虎影视国产在线视频http://www.aygfsteel.com/jimingminlovefly/category/51159.htmlzh-cnTue, 12 Jun 2012 00:29:19 GMTTue, 12 Jun 2012 00:29:19 GMT60设计模式-工厂模式http://www.aygfsteel.com/jimingminlovefly/articles/372207.html计明?/dc:creator>计明?/author>Mon, 19 Mar 2012 08:58:00 GMThttp://www.aygfsteel.com/jimingminlovefly/articles/372207.htmlhttp://www.aygfsteel.com/jimingminlovefly/comments/372207.htmlhttp://www.aygfsteel.com/jimingminlovefly/articles/372207.html#Feedback0http://www.aygfsteel.com/jimingminlovefly/comments/commentRss/372207.htmlhttp://www.aygfsteel.com/jimingminlovefly/services/trackbacks/372207.html 一、工厂模式主要是为创建对象提供过渡接口,以便创建对象的具体q程屏蔽隔离hQ达到提高灵zL的目的?/strong>

 

工厂模式在《Java与模式》中分ؓ(f)三类Q?br />1Q简单工厂模式(Simple FactoryQ:(x)不利于生系列品;

2Q工厂方法模式(F(tun)actory MethodQ:(x)又称为多形性工厂;

3Q抽象工厂模式(Abstract FactoryQ:(x)又称为工L(fng)Q生品族Q但不利于生新的品;
             q三U模式从上到下逐步抽象Qƈ且更具一般性?br />             GOF在《设计模式》一书中工厂模式分Zc:(x)工厂Ҏ(gu)模式QF(tun)actory MethodQ与抽象工厂模式QAbstract FactoryQ。将单工厂模式(Simple FactoryQ看为工厂方法模式的一U特例,两者归ZcR?br />

二、简单工厂模?/strong>

单工厂模式又U?strong>静态工厂方法模?/strong>。重命名上就可以看出q个模式一定很单。它存在的目的很单:(x)定义一个用于创建对象的接口?/div>

在简单工厂模式中,一个工厂类处于对品类实例化调用的中心位置?它决定那一个品类应当被实例化, 如同一个交通警察站在来往的R辆流?军_放行那一个方向的车辆向那一个方向流动一栗?/div>
        先来看看它的l成Q?br />
         1) 工厂c角Ԍ(x)q是本模式的核心Q含有一定的商业逻辑和判断逻辑。在java中它往往׃个具体类实现?br />
         2) 抽象产品角色Q它一般是具体产品l承的父cL者实现的接口。在java中由接口或者抽象类来实现?br />
         3) 具体产品角色Q工厂类所创徏的对象就是此角色的实例。在java中由一个具体类实现?br />
三、工厂方法模?/strong>

工厂Ҏ(gu)模式是简单工厂模式的q一步抽象化和推q,工厂Ҏ(gu)模式里不再只׃个工厂类军_那一个品类应当被实例化,q个军_被交l抽象工厂的子类d?br />  来看下它的组成:(x)

       1)抽象工厂角色Q这是工厂方法模式的核心Q它与应用程序无兟뀂是具体工厂角色必须实现的接口或者必ȝ承的父类。在java中它由抽象类或者接口来实现?br />
       2)具体工厂角色Q它含有和具体业务逻辑有关的代码。由应用E序调用以创建对应的具体产品的对象?br />
       3)抽象产品角色Q它是具体品承的父类或者是实现的接口。在java中一般有抽象cL者接口来实现?br />
       4)具体产品角色Q具体工厂角色所创徏的对象就是此角色的实例。在java中由具体的类来实现?br />       工厂Ҏ(gu)模式使用l承自抽象工厂角色的多个子类来代替简单工厂模式中?#8220;上帝c?#8221;。正如上面所_(d)q样便分担了对象承受的压力;而且q样使得l构变得灉|h——当有新的产品Q即暴发L(fng)汽RQ生时Q只要按照抽象品角艌Ӏ抽象工厂角色提供的合同来生成,那么可以被客户使用Q而不必去修改M已有的代码。可以看出工厂角色的l构也是W合开闭原则的Q?br />
代码Q?
//抽象产品角色
public interface Moveable {
    void run();
}
//具体产品角色
public class Plane implements Moveable {
    @Override
    public void run() {
        System.out.println("plane....");
    }
}

public class Broom implements Moveable {
    @Override
    public void run() {
        System.out.println("broom.....");
    }
}

//抽象工厂
public abstract class VehicleFactory {
    abstract Moveable create();
}
//具体工厂
public class PlaneFactory extends VehicleFactory{
    public Moveable create() {
        return new Plane();
    }
}
public class BroomFactory extends VehicleFactory{
    public Moveable create() {
        return new Broom();
    }
}
//试c?br />public class Test {
    public static void main(String[] args) {
        VehicleFactory factory = new BroomFactory();
        Moveable m = factory.create();
        m.run();
    }
}


可以看出工厂Ҏ(gu)的加入,使得对象的数量成倍增ѝ当产品U类非常多时Q会(x)出现大量的与之对应的工厂对象Q这不是我们所希望的。因为如果不能避免这U情况,可以考虑使用单工厂模式与工厂Ҏ(gu)模式相结合的方式来减工厂类Q即对于产品?wi)上cM的种c(一般是?wi)的叶子中互为兄弟的Q用简单工厂模式来实现?br />
四、简单工厂和工厂Ҏ(gu)模式的比?/span>

工厂Ҏ(gu)模式和简单工厂模式在定义上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模? 把核心放在一个实cM。工厂方法模式可以允许很多实的工厂类从抽象工厂类l承下来, 从而可以在实际上成为多个简单工厂模式的l合,从而推q了单工厂模式?
反过来讲,单工厂模式是由工厂方法模式退化而来。设惛_果我们非常确定一个系l只需要一个实的工厂类, 那么׃妨把抽象工厂cdq到实的工厂cM厅R而这样一?我们退化到单工厂模式了?br />
五、抽象工厂模?/strong>
代码Q?/div>
//抽象工厂c?/div>
public abstract class AbstractFactory {
    public abstract Vehicle createVehicle();
    public abstract Weapon createWeapon();
    public abstract Food createFood();
}
//具体工厂c,其中Food,VehicleQW(xu)eapon是抽象类Q?/div>
public class DefaultFactory extends AbstractFactory{
    @Override
    public Food createFood() {
        return new Apple();
    }
    @Override
    public Vehicle createVehicle() {
        return new Car();
    }
    @Override
    public Weapon createWeapon() {
        return new AK47();
    }
}
//试c?/div>
public class Test {
    public static void main(String[] args) {
        AbstractFactory f = new DefaultFactory();
        Vehicle v = f.createVehicle();
        v.run();
        Weapon w = f.createWeapon();
        w.shoot();
        Food a = f.createFood();
        a.printName();
    }
}
在抽象工厂模式中Q抽象?(AbstractProduct) 可能是一个或多个Q从而构成一个或多个产品?Product Family)?在只有一个品族的情况下Q抽象工厂模式实际上退化到工厂Ҏ(gu)模式?/div>

六、ȝ?/strong>

Q?Q?/span>单工厂模式是׃个具体的cd创徏其他cȝ实例Q父cL相同的,父类是具体的?
Q?Q工厂方法模式是有一个抽象的父类定义公共接口Q子c负责生成具体的对象Q这样做的目的是类的实例化操作延迟到子cM完成?
Q?Q抽象工厂模式提供一个创Zpd相关或相互依赖对象的接口Q而无L定他们具体的cR它针对的是有多个品的{l构。而工厂方法模式针对的是一个品的{l构?/span>


]]>设计模式-代理模式http://www.aygfsteel.com/jimingminlovefly/articles/372181.html计明?/dc:creator>计明?/author>Mon, 19 Mar 2012 03:42:00 GMThttp://www.aygfsteel.com/jimingminlovefly/articles/372181.htmlhttp://www.aygfsteel.com/jimingminlovefly/comments/372181.htmlhttp://www.aygfsteel.com/jimingminlovefly/articles/372181.html#Feedback0http://www.aygfsteel.com/jimingminlovefly/comments/commentRss/372181.htmlhttp://www.aygfsteel.com/jimingminlovefly/services/trackbacks/372181.htmlȝQ?Q代理对象承真实对象?Q代理对象的Ҏ(gu)跟真实对象的Ҏ(gu)名一栗?Q代理对象的Ҏ(gu)调用Q是引用了真实对象再调用真实对象的方?/span>

1、代理模?/font>

所谓代理,是一个h或者一个机构代表另一个h或者另一个机构采取行动。在一些情况下Q一个客户不x者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用?br />代理模式l某一个对象提供一个代理对象,q由代理对象控制对原对象的引用?/font>

生活中的例子Q过q加班比较忙Q没I去买火车票Q这时可以打个电(sh)话到附近的票务中心,叫他们帮你买张回家的火R,当然q会(x)附加额外的劳务费。但要清楚票务中心自己ƈ不卖,只有火R站才真正卖票Q票务中心卖l你的票其实是通过火R站实现的。这点很重要Q?/font>

上面q个例子Q你是“客户”Q票务中心就?#8220;代理角色”Q火车站?#8220;真实角色”Q卖称?#8220;抽象角色”Q?/font>


代理模式JAVA代码CZQ?br /> //抽象角色Q抽象类或接?br />

  1. interface Business  
  2. {  
  3.     void doAction();  
  4. }  

 //真实角色Q真正实C业务逻辑接口

//代理角色Q自己ƈ未实C务逻辑接口Q而是调用真实角色来实?
  1. class BusinessImplProxy implements Business  
  2. {  
  3.     private BusinessImpl bi;  
  4.     public void doAction()  
  5.     {  
  6.         if (bi==null)  
  7.         {  
  8.             bi = new BusinessImpl();  
  9.         }  
  10.         doBefore();  
  11.         bi.doAction();  
  12.         doAfter();  
  13.     }  
  14.     public void doBefore()  
  15.     {  
  16.         System.out.println("前置处理Q?);  
  17.     }  
  18.     public void doAfter()  
  19.     {  
  20.         System.out.println("后置处理Q?);  
  21.     }  
  22. }  
  23. //试c?/span>  
  24. class Test  
  25. {  
  26.     public static void main(String[] args)  
  27.     {  
  28.         //引用变量定义为抽象角色类?/span>  
  29.         Business bi = new BusinessImplProxy();  
  30.         bi.doAction();  
  31.     }  
  32. }  

 

所以,借助于JVM的支持,可以在运行时动态生成代理类Q?#8220;代理角色”Q,我们可以解决上qC理模式中代码膨胀的问题,使用了动态代理后Q?#8220;代理角色”不用手动生成,而由JVM在运行时Q通过指定cd载器、接口数l、调用处理程序这3个参数来动态生成?/font>

动态代理模式JAVA代码CZQ?br />

  1. import java.lang.reflect.InvocationHandler;  
  2.  import java.lang.reflect.Proxy;  
  3.  import java.lang.reflect.Method;  
  4.  //抽象角色Qjava动态代理的实现目前只支持接口,不支持抽象类  
  5.  interface BusinessFoo  
  6.  {  
  7.      void foo();  
  8.  }  
  9.  interface BusinessBar  
  10. {  
  11.     String bar(String message);  
  12. }  
  13. //真实角色Q真正实C务逻辑Ҏ(gu)  
  14. class BusinessFooImpl implements BusinessFoo  
  15. {  
  16.     public void foo()  
  17.     {  
  18.         System.out.println("BusinessFooImpl.foo()");  
  19.     }  
  20. }  
  21. class BusinessBarImpl implements BusinessBar  
  22. {  
  23.     public String bar(String message)  
  24.     {  
  25.         System.out.println("BusinessBarImpl.bar()");  
  26.         return message;  
  27.     }  
  28. }  
  29. //动态角Ԍ(x)动态生成代理类  
  30. class BusinessImplProxy implements InvocationHandler  
  31. {  
  32.     private Object obj;  
  33.     BusinessImplProxy() {  
  34.     }  
  35.     BusinessImplProxy(Object obj) {  
  36.         this.obj = obj;  
  37.     }  
  38.     public Object invoke(Object proxy,Method method,Object[] args) throws Throwable  
  39.     {  
  40.         Object result = null;  
  41.         doBefore();  
  42.         result = method.invoke(obj,args);  
  43.         doAfter();  
  44.         return result;  
  45.     }  
  46.     public void doBefore(){  
  47.         System.out.println("do something before Business Logic");  
  48.     }  
  49.     public void doAfter(){  
  50.         System.out.println("do something after Business Logic");  
  51.     }  
  52.     public static Object factory(Object obj)  
  53.     {  
  54.         Class cls = obj.getClass();  
  55.         return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),new BusinessImplProxy(obj));  
  56.     }  
  57. }  
  58. //试c?/span>  
  59. public class DynamicProxy  
  60. {      
  61.     public static void main(String[] args) throws Throwable  
  62.     {  
  63.         BusinessFooImpl bfoo = new BusinessFooImpl();  
  64.         BusinessFoo bf = (BusinessFoo)BusinessImplProxy.factory(bfoo);  
  65.         bf.foo();  
  66.         System.out.println();  
  67.           
  68.         BusinessBarImpl bbar = new BusinessBarImpl();  
  69.         BusinessBar bb = (BusinessBar)BusinessImplProxy.factory(bbar);  
  70.         String message = bb.bar("Hello,World");  
  71.         System.out.println(message);  
  72.     }  
  73. }  
 

 

E序程说明Q?br />       new BusinessFooImpl();创徏一?#8220;真实角色”Q传递给工厂Ҏ(gu)BusinessImplProxy.factory()Q进而初始化“调用处理?#8221;——卛_现InvocationHandler的类。ƈq回一个动态创建的代理cd例,׃“代理角色”也必然实C“抽象角色”提供的业务逻辑Ҏ(gu)Q故可向下{型ؓ(f)BusinessBarQƈ赋值给指向B(ti)usinessBarcd的引用bb?br />       newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)Ҏ(gu)q序员来指定参数动态返回需要的代理c,而invoke(Object proxy, Method method, Object[] args) Ҏ(gu)则是由JVM在运行时动态调用的。当执行“bb.bar("Hello,World");”Ҏ(gu)ӞJVM动态指z?#8220;调用处理?#8221;Q向外层 invoke传递参敎ͼq调用method.invoke(obj,args)真正执行Q?/font>

BusinessImplProxy.Factory静态方法用来动态生成代理类Q?#8220;代理角色”Q,在运行时Ҏ(gu)不同的业务逻辑接口BusinessFoo和BusinessBarQ在q行时分别动态生成了代理角色?#8220;抽象角色”?“代理角色”以及调用处理器(实现InvocationHandler接口的类Q这三者都可以改变Q所以说JAVA的动态代理十分强大?/font>



]]>
վ֩ģ壺 | | | | | Զ| | | | ½| | ξ| | ľ| Ԫ| Ǭ| ũ| | ߱| ӯ| ɽ| | | | ˮ| | | | | | ڽ| | | | Dz| ϳ| | | | ƽ| |