??xml version="1.0" encoding="utf-8" standalone="yes"?>三级黄视频在线观看,国产日产精品一区二区三区四区的观看方式,四虎影视国产在线视频 http://www.aygfsteel.com/jimingminlovefly/category/51159.htmlzh-cn Tue, 12 Jun 2012 00:29:19 GMT Tue, 12 Jun 2012 00:29:19 GMT 60 设计模式-工厂模式 http://www.aygfsteel.com/jimingminlovefly/articles/372207.html计明?/dc:creator>计明?/author>Mon, 19 Mar 2012 08:58:00 GMT http://www.aygfsteel.com/jimingminlovefly/articles/372207.html http://www.aygfsteel.com/jimingminlovefly/comments/372207.html http://www.aygfsteel.com/jimingminlovefly/articles/372207.html#Feedback 0 http://www.aygfsteel.com/jimingminlovefly/comments/commentRss/372207.html http://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 GMT http://www.aygfsteel.com/jimingminlovefly/articles/372181.html http://www.aygfsteel.com/jimingminlovefly/comments/372181.html http://www.aygfsteel.com/jimingminlovefly/articles/372181.html#Feedback 0 http://www.aygfsteel.com/jimingminlovefly/comments/commentRss/372181.html http://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 />
interface Business { void doAction(); } //真实角色Q真正实C业务逻辑接口 //代理角色Q自己ƈ未实C务逻辑接口Q而是调用真实角色来实?
class BusinessImplProxy implements Business { private BusinessImpl bi; public void doAction() { if (bi== null ) { bi = new BusinessImpl(); } doBefore(); bi.doAction(); doAfter(); } public void doBefore() { System.out.println("前置处理Q? ); } public void doAfter() { System.out.println("后置处理Q? ); } } class Test { public static void main(String[] args) { Business bi = new BusinessImplProxy(); bi.doAction(); } }
所以,借助于JVM的支持,可以在运行时动态生成代理类Q?#8220;代理角色”Q,我们可以解决上qC理模式中代码膨胀的问题,使用了动态代理后Q?#8220;代理角色”不用手动生成,而由JVM在运行时Q通过指定cd载器、接口数l、调用处理程序这3个参数来动态生成?/font>
动态代理模式JAVA代码CZQ?br />
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import java.lang.reflect.Method; interface BusinessFoo { void foo(); } interface BusinessBar { String bar(String message); } class BusinessFooImpl implements BusinessFoo { public void foo() { System.out.println("BusinessFooImpl.foo()" ); } } class BusinessBarImpl implements BusinessBar { public String bar(String message) { System.out.println("BusinessBarImpl.bar()" ); return message; } } class BusinessImplProxy implements InvocationHandler { private Object obj; BusinessImplProxy() { } BusinessImplProxy(Object obj) { this .obj = obj; } public Object invoke(Object proxy,Method method,Object[] args) throws Throwable { Object result = null ; doBefore(); result = method.invoke(obj,args); doAfter(); return result; } public void doBefore(){ System.out.println("do something before Business Logic" ); } public void doAfter(){ System.out.println("do something after Business Logic" ); } public static Object factory(Object obj) { Class cls = obj.getClass(); return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(), new BusinessImplProxy(obj)); } } public class DynamicProxy { public static void main(String[] args) throws Throwable { BusinessFooImpl bfoo = new BusinessFooImpl(); BusinessFoo bf = (BusinessFoo)BusinessImplProxy.factory(bfoo); bf.foo(); System.out.println(); BusinessBarImpl bbar = new BusinessBarImpl(); BusinessBar bb = (BusinessBar)BusinessImplProxy.factory(bbar); String message = bb.bar("Hello,World" ); System.out.println(message); } }
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 |
ϳ |
|
|
|
ƽ |
|