??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩精品三区四区,天堂成人国产精品一区,污网站在线免费看http://www.aygfsteel.com/ocean07000814/category/37327.html共同探讨STRUTS#HIBERNATE#SPRING#EJB{技?/description>zh-cnWed, 21 Jan 2009 10:29:43 GMTWed, 21 Jan 2009 10:29:43 GMT60抽象工厂模式-?工厂Ҏ模式区别http://www.aygfsteel.com/ocean07000814/articles/252087.html非洲白?/dc:creator>非洲白?/author>Tue, 20 Jan 2009 09:34:00 GMThttp://www.aygfsteel.com/ocean07000814/articles/252087.htmlhttp://www.aygfsteel.com/ocean07000814/comments/252087.htmlhttp://www.aygfsteel.com/ocean07000814/articles/252087.html#Feedback0http://www.aygfsteel.com/ocean07000814/comments/commentRss/252087.htmlhttp://www.aygfsteel.com/ocean07000814/services/trackbacks/252087.html
抽象工厂UML图:


Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br /> 对于java来说Q你能见到的大部分抽象工厂模式都是这LQ?
它的里面是一堆工厂方法,每个工厂Ҏq回某种cd的对象?

比如说工厂可以生产鼠标和键盘。那么抽象工厂的实现c(它的某个具体子类Q的对象都可以生产鼠标和键盘Q但可能工厂A生的是|技的键盘和鼠标Q工厂B是微软的?

q样A和B是工厂Q对应于抽象工厂Q?
每个工厂生的鼠标和键盘是产品Q对应于工厂ҎQ?

用了工厂Ҏ模式Q你替换生成键盘的工厂方法,可以把键盘从罗技换到微Y。但是用了抽象工厂模式,你只要换家工厂,可以同时替换鼠标和键盘一套。如果你要的产品有几十个Q当然用抽象工厂模式一ơ替换全部最方便Q这个工厂会替你用相应的工厂ҎQ?

所以说抽象工厂像工厂Q而工厂方法则像是工厂的一U品生产线
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br /> “抽象工厂”模式依赖?#8220;工厂Ҏ”模式的。因此,抽象工厂的是前面的动?#8220;抽象”Q也是_你将工厂Ҏ模式中的工厂Ҏ抽象出来的那?动作或设?是“抽象工程”模式了?br /> Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br /> factory method针对的是一个品等U结?nbsp; 
abstract factory是面向多个品等U结构的
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br /> 工厂Ҏ模式Q一个抽象品类Q可以派生出多个具体产品cR?nbsp;
                              一个抽象工厂类Q可以派生出多个具体工厂cR?nbsp;
                              每个具体工厂cd能创Z个具体品类的实例?nbsp;
抽象工厂模式Q多个抽象品类Q每个抽象品类可以z出多个具体品类?nbsp;
                              一个抽象工厂类Q可以派生出多个具体工厂cR?nbsp;
                              每个具体工厂cd以创建多个具体品类的实例?nbsp;
  
区别Q工厂方法模式只有一个抽象品类Q而抽象工厂模式有多个?br />       工厂Ҏ模式的具体工厂类只能创徏一个具体品类的实例,而抽象工厂模式可以创建多个?br /> Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br />    1.如果一个后花园只种蔬菜c?那么q单工厂就可以?
   2.如果后花园蔬菜品U繁?得用工厂Ҏ才可?把共有的东西抽象出来.
   3.如果要扩大后花园的规?比如一个在北方,一个在南方,q样工厂Ҏ无法实C,应当用抽象工厂,把各U各L植物,又组成一个后花园.
所以我个h认ؓ,单工厂是一个工厂只生一cȝ产品,面对的是具体的类,工厂Ҏ是可以生产不同的产品,把公qҎ抽象出来,然后q行创徏各种各样的?抽象工厂把几U品划出共同的东西,把相互依赖的对象抽象出来,只要实现q些接口可以得C同的产品.
具体例子:
1.单工?

using System; 
public interface ICar 

     
void run(); 


public class BMWCar : ICar 

     
public void run() 
     { 
         Console.WriteLine(
"BMWCar run"); 
     } 


public class BenzCar : ICar 

     
public void run() 
     { 
         Console.WriteLine(
"BenzCar run"); 
     } 


public class Driver 

     
public static ICar DriverCar(string carType) 
     { 
         
switch (carType) 
         { 
             
case "BMWCar"return new BMWCar(); 
             
case "BenzCar"return new BenzCar(); 
             
defaultthrow new Exception(); 
        } 
     } 


public class Client 

     
public static void Main() 
     { 
         ICar myCar 
= Driver.DriverCar("BenzCar"); 
         myCar.run(); 
         Console.Read(); 
     } 
}

心得:优点是只要实现共有的接口可以实C同R跑的方式.但缺点就是要判断哪一UR,造成要修改Driver c?br /> 2.工厂Ҏ:
using System; 
public interface ICar 

     
void run(); 


public class BMWCar : ICar 

     
public void run() 
     { 
         Console.WriteLine(
"BMWCar run"); 
     } 


public class BenzCar : ICar 

     
public void run() 
     { 
         Console.WriteLine(
"BenzCar run"); 
     } 

public abstract class Driver 

     
public abstract ICar DriverCar(); 


public class BMWDriver : Driver 

     
public override ICar   DriverCar() 
     { 
         
return new BMWCar(); 
     } 


public class BenzDriver : Driver 

     
public   override ICar DriverCar() 
     { 
         
return new BenzCar(); 
     } 


class Client 

     
public static void Main() 
     { 
         Driver myDriver 
= new BenzDriver(); 
         ICar myCar 
= myDriver.DriverCar(); 
         myCar.run(); 
         Console.Read(); 
     } 
}

心得:优点是符合了开?闭原则(OCP),从整体上q看不出什么缺?

3.抽象工厂:

using System; 

public interface IBusinessCar 

     
void run(); 


public interface ISportCar 

void run(); 


public class BMWBusinessCar : IBusinessCar 

     
public void run() 
     { 
         Console.WriteLine(
"BMWCar run"); 
     }

}

public class BenzBusinessCar : IBusinessCar 

     
public void run() 
     { 
         Console.WriteLine(
"BenzBusinessCar run"); 
     } 


public class BMWSportCar:ISportCar 

public void run() 

Console.WriteLine(
"BMWSportCar run"); 



public class BenzSportCar:ISportCar 

public void run() 
{

Console.WriteLine(
"BenzSportCar run"); 



public interface IDriver 

IBusinessCar BusinessCarDriver(); 
ISportCar SportCarDriver(); 


public class BMWDriver:IDriver 

public IBusinessCar BusinessCarDriver() 

return new BMWBusinessCar(); 

public ISportCar SportCarDriver() 

return new BMWSportCar(); 



public class BenzDriver:IDriver 

public IBusinessCar BusinessCarDriver() 

return new BenzBusinessCar(); 


public ISportCar SportCarDriver() 

return new BenzSportCar(); 

}


class Client 

     
public static void Main() 
     { 
         IDriver myDriver 
=new BenzDriver(); 
         ISportCar myCar 
= myDriver.SportCarDriver(); 
         myCar.run(); 
         Console.Read(); 
     }

}


心得:抽象Ҏg辑ֈ了完境?把开奔驰的司机和开宝马的司机的公共Ҏ抽象出来,q对不同的司机创Z同的c?到时候不是开什么R的司机随你添?它们唯一的共同点都是开?

]]>
抽象工厂模式http://www.aygfsteel.com/ocean07000814/articles/252086.html非洲白?/dc:creator>非洲白?/author>Tue, 20 Jan 2009 09:33:00 GMThttp://www.aygfsteel.com/ocean07000814/articles/252086.htmlhttp://www.aygfsteel.com/ocean07000814/comments/252086.htmlhttp://www.aygfsteel.com/ocean07000814/articles/252086.html#Feedback0http://www.aygfsteel.com/ocean07000814/comments/commentRss/252086.htmlhttp://www.aygfsteel.com/ocean07000814/services/trackbacks/252086.html设计模式-快餐?【抽象工厂模式?/strong>

?strong>抽象工厂模式应用场景举例
?br /> 写到抽象工厂模式了,我深?#8220;抽象工厂模式”博文会带来一点点高潮Q因为程序员对工厂模式中?#8220;抽象工厂”都是比较感冒的,而且x也很多,我就量用我所能理解的那么点程度来l大家介l这个模式,如果有更好的比喻q请|友指正Q先感谢了!
在设计模?快餐?【工厂方法模式】博文,地址是:
http://www.aygfsteel.com/ghyghost/archive/2008/11/11/239909.html
介绍了工厂方法的使用Q从那个E序中可以看刎ͼ奥_audi车是从audi_car_factory_imple工厂中创建出来的Q而大?W车是? threeW_car_factory_imple工厂中创建出来的Q那么如果这2家汽车生产大厂由总部在北京市Q现在发展到上vQ深圳等城市创徏生气? 车的分厂Q该怎么办?是不是得原来的奥_汽R工厂c:
public class audi_car_factory_imple implements Icar_factory {

    
public Icar_interface create_car() {

        car_audi_imple car_audi_imple_ref 
= new car_audi_imple();
        car_audi_imple_ref.setName(
"奥_A6");
        car_audi_imple_ref.setSpeed(
300);

        
return car_audi_imple_ref;
    }
}


ҎcM如下的模P

public class audi_car_factory_imple implements Icar_factory {

    
public Icar_interface create_car(String area_car) {

if (area_car.equals("北京")){创徏一个北京的奥_汽R}

if (area_car.equals("上v")){创徏一个上L奥_汽R}

if (area_car.equals("深圳")){创徏一个深圳的奥_汽R}

        
return car_audi_imple_ref;
    }
}


那么发现一个问题,不同地域的汽车却在一个工厂中出现Q这是不合乎常理的,因ؓ北京奥_在北京分厂创建,上v奥_在上分厂创建,q样才对?br />
所以如果遇到分“大系”来创建对象的时候,抽象工厂Ҏ是肯定要使用的时候了。这里的大系指的是从地域上来分?br />
q个例子应该以“用抽象工厂来定义具体工厂的抽象,而由具体工厂来创建对?#8221;

比如在玩“极品飞R”q款游戏Q每个地囑֤都有造R的工厂,每个造R的工厂都因ؓ有造R的档ơ不同而划分ؓ高车厂Q低UR厂,那么q样的场景正是应 用抽象工厂的好时机,再来理解一下这句话“用抽象工厂来定义具体工厂的抽象,而由具体工厂来创建对?#8221;Q用抽象造R工厂来定义具体造R工厂的抽象,而由? 体的造R工厂来创建汽车,q就是抽象工厂与工厂Ҏ的不同,工厂Ҏ中对象的创徏是由工厂Ҏ来确定的Q创建的对象都是不分cdƈ且实C个接口的Q而抽? 工厂是在工厂方法的基础上对创徏车的对象的行行分c,比如北京车厂Q上R厂等?br />
?strong>抽象工厂模式解释?br /> cdQ创建模?br />   提供一个创Zpd相关或相互依赖对象的接口Q而无需指定他们具体的类?br />
?strong>抽象工厂模式UML?/strong>?br />

?strong>抽象工厂模式-JAVA代码实现?br /> 新徏抽象工厂接口Q?/p>

package car_factory_interface;

import car_interface.Icar_interface;

public interface Icar_factory {

    
public Icar_interface create_threeW_car();

    
public Icar_interface create_audi_car();

}


新徏抽象工厂接口的高URadv工厂实现c:

package car_factory_imple;

import car_factory_interface.Icar_factory;
import car_imple.car_3w_imple_adv;
import car_imple.car_audi_imple_adv;
import car_interface.Icar_interface;

public class car_factory_adv implements Icar_factory {

    
public Icar_interface create_audi_car() {

        car_audi_imple_adv car_audi_imple_adv 
= new car_audi_imple_adv();
        car_audi_imple_adv.setName(
"奥_A6");
        car_audi_imple_adv.setSpeed(
300);

        
return car_audi_imple_adv;
    }

    
public Icar_interface create_threeW_car() {
        
        car_3w_imple_adv car_3w_imple_adv_ref 
= new car_3w_imple_adv();
        car_3w_imple_adv_ref.setName(
"大众A6");
        car_3w_imple_adv_ref.setSpeed(
300);

        
return car_3w_imple_adv_ref;
    }

}

 

  新徏抽象工厂接口的普通Rlow工厂实现c:

package car_factory_imple;

import car_factory_interface.Icar_factory;
import car_imple.car_3w_imple_low;
import car_imple.car_audi_imple_low;
import car_interface.Icar_interface;

public class car_factory_low implements Icar_factory {

    
public Icar_interface create_audi_car() {

        car_audi_imple_low car_audi_imple_low_ref 
= new car_audi_imple_low();
        car_audi_imple_low_ref.setName(
"奥_A6");
        car_audi_imple_low_ref.setSpeed(
300);

        
return car_audi_imple_low_ref;
    }

    
public Icar_interface create_threeW_car() {
        
        car_3w_imple_low car_3w_imple_low_ref 
= new car_3w_imple_low();
        car_3w_imple_low_ref.setName(
"大众A6");
        car_3w_imple_low_ref.setSpeed(
300);

        
return car_3w_imple_low_ref;
    }

}


上面已经有抽象工厂和具体工厂的实现类了?br />
新徏汽R接口Q?/p>

package car_interface;

public interface Icar_interface {

    
public void start();

    
public void stop();

}


新徏汽R父类Q?/p>

package car_imple;

import car_interface.Icar_interface;

public class base_car_imple implements Icar_interface {

    
private int speed;

    
private String name;

    
public int getSpeed() {
        
return speed;
    }

    
public void setSpeed(int speed) {
        
this.speed = speed;
    }

    
public String getName() {
        
return name;
    }

    
public void setName(String name) {
        
this.name = name;
    }

    
public void start() {
        
// TODO Auto-generated method stub

    }

    
public void stop() {
        
// TODO Auto-generated method stub

    }

}


新徏大众高车:

package car_imple;

import car_interface.Icar_interface;

public class car_3w_imple_adv extends base_car_imple {

    
public void start() {
        System.out.println(
"富华版:" + this.getName() + " 车以专利技术v动了 最高速度为:"
                
+ this.getSpeed());
    }

    
public void stop() {
        System.out.println(
"富华版:" + this.getName() + " 车以专利技术停车了");
    }

}


新徏大众普通RQ?/p>

package car_imple;

import car_interface.Icar_interface;

public class car_3w_imple_low extends base_car_imple {

    
public void start() {
        System.out.println(
"普通版Q?/span>" + this.getName() + " 车以专利技术v动了 最高速度为:"
                
+ this.getSpeed());
    }

    
public void stop() {
        System.out.println(
"普通版Q?/span>" + this.getName() + " 车以专利技术停车了");
    }

}


新徏奥_高车:

package car_imple;

import car_interface.Icar_interface;

public class car_audi_imple_adv extends base_car_imple {

    
public void start() {
        System.out.println(
"富华版:" + this.getName() + " 车以专利技术v动了 最高速度为:"
                
+ this.getSpeed());
    }

    
public void stop() {
        System.out.println(
"富华版:" + this.getName() + " 车以专利技术停车了");
    }

}


新徏奥_普通RQ?/p>

package car_imple;

import car_interface.Icar_interface;

public class car_audi_imple_low extends base_car_imple {

    
public void start() {
        System.out.println(
"普通版Q?/span>" + this.getName() + " 车以专利技术v动了 最高速度为:"
                
+ this.getSpeed());
    }

    
public void stop() {
        System.out.println(
"普通版Q?/span>" + this.getName() + " 车以专利技术停车了");
    }

}


新徏客户端运行类Q?/p>

package run_main;

import car_factory_imple.car_factory_adv;
import car_factory_interface.Icar_factory;
import car_interface.Icar_interface;

public class run_main {

    
public static void main(String[] args) {

        Icar_factory Icar_factory_ref 
= new car_factory_adv();

        Icar_interface Icar_interface_ref 
= Icar_factory_ref
                .create_threeW_car();
        Icar_interface_ref.start();
        Icar_interface_ref.stop();

        
    }
}


E序q行l果如下Q?/p>

富华版:大众A6 车以专利技术v动了 最高速度为:300
富华版:大众A6 车以专利技术停车了


抓一阎宏的文字:

一开始只在后花园中种蔬菜cȝ时候可以用单工厂模式,由工厂负责生成具体的蔬菜c,

但是如果后花园要引进水果cȝ时候简单模式就行不通了Q因此需要用工厂方法模式,品类族分开?br />
但是如果后花园的规模l箋扩大到地域范围的分割Ӟ比如说一个在北京Q一个在上v的时候,工厂Ҏ模式׃够了Q因为对两个后花园来_每个后花园的植物是要被种在一LQƈ且两个后花园用工厂方法模式是无法体现其区别的?/span>

从程序中可以看到Q工厂是抽象的,工厂的实现是不样的,不同的工厂创建出不同汽R。而工厂方法仅仅是用一个工厂去创徏很多汽R?br />

]]>
观察者模?/title><link>http://www.aygfsteel.com/ocean07000814/articles/252085.html</link><dc:creator>非洲白?/dc:creator><author>非洲白?/author><pubDate>Tue, 20 Jan 2009 09:32:00 GMT</pubDate><guid>http://www.aygfsteel.com/ocean07000814/articles/252085.html</guid><wfw:comment>http://www.aygfsteel.com/ocean07000814/comments/252085.html</wfw:comment><comments>http://www.aygfsteel.com/ocean07000814/articles/252085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ocean07000814/comments/commentRss/252085.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ocean07000814/services/trackbacks/252085.html</trackback:ping><description><![CDATA[<span style="color: #008000;"><span style="color: #000000;"><strong>设计模式-快餐?【观察者模式?/strong><br /> </span></span><br /> ?strong>观察者模式应用场景D?/strong>?br /> 比如在玩“极品飞R”q款游戏Q每一个R手到辄点的时候,都会在其它R手的屏幕上显C:某某Z多少旉到达l点的提C,其实q就是一个典型的观察者模式的应用Q观察者模式即是典型的双向一对多的应用场景下用一的一端来通知多的一端?br /> <br /> ?strong><strong>观察?/strong>模式解释</strong>?br /> <span style="color: #ff0000;">cdQ行为模?br /> </span>  定义了一U一对多的依赖关p,让多个观察者对象同时监听某一个主题对象。这个主题对象的状态发生改变时Q会通知所有的观察者对象,使它们能够自己更新自己?br /> <br /> ?strong><strong>观察?/strong>模式UML?/strong>?br /> <img alt="" src="../../images/blogjava_net/ghyghost/35864/o_observer.gif" border="0" /><br /> <br /> ?strong><strong>观察?/strong>模式-JAVA代码实现</strong>?br /> 新徏抽象发布通知父类Q? <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">package</span><span style="color: #000000;"> carer_subject;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.ArrayList;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.List;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> carer_observer.carer_observer;<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> carer_subject_parent {<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> set_state(String state_string);<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String get_state();<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> add_observer(carer_observer carer_observer_ref);<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> sub_observer(carer_observer carer_observer_ref);<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> notityAllCarer();<br /> <br /> }</span></div> <p><br /> 新徏发布通知实现c:</p> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;"><br /> </span><span style="color: #0000ff;">package</span><span style="color: #000000;"> carer_subject;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.ArrayList;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.List;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> carer_observer.carer_observer;<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> carer_subject_sub </span><span style="color: #0000ff;">implements</span><span style="color: #000000;"> carer_subject_parent {<br /> <br />     List</span><span style="color: #000000;"><</span><span style="color: #000000;">carer_observer</span><span style="color: #000000;">></span><span style="color: #000000;"> list_observer </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> ArrayList</span><span style="color: #000000;"><</span><span style="color: #000000;">carer_observer</span><span style="color: #000000;">></span><span style="color: #000000;">();<br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String state;<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> set_state(String state_string) {<br />         </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.state </span><span style="color: #000000;">=</span><span style="color: #000000;"> state_string;<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String get_state() {<br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> state;<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> add_observer(carer_observer carer_observer_ref) {<br />         list_observer.add(carer_observer_ref);<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> sub_observer(carer_observer carer_observer_ref) {<br />         list_observer.remove(carer_observer_ref);<br /> <br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> notityAllCarer() {<br />         state </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">到达l点</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />         </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> i </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">; i </span><span style="color: #000000;"><</span><span style="color: #000000;"> list_observer.size(); i</span><span style="color: #000000;">++</span><span style="color: #000000;">) {<br />             list_observer.get(i).show_info();<br />         }<br /> <br />     }<br /> <br /> }</span></div> <p> </p> <p>  新徏观察者接口:</p> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">package</span><span style="color: #000000;"> carer_observer;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> carer_subject.carer_subject_parent;<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> carer_observer {<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> show_info();<br /> <br /> }</span></div> <p><br /> 新徏观察者实现类Q?/p> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">package</span><span style="color: #000000;"> carer_observer;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> carer_subject.carer_subject_parent;<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> carer_observer_imple </span><span style="color: #0000ff;">implements</span><span style="color: #000000;"> carer_observer {<br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> carer_subject_parent carer_subject_parent_ref;<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> carer_subject_parent getCarer_subject_parent_ref() {<br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> carer_subject_parent_ref;<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> setCarer_subject_parent_ref(<br />             carer_subject_parent carer_subject_parent_ref) {<br />         </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.carer_subject_parent_ref </span><span style="color: #000000;">=</span><span style="color: #000000;"> carer_subject_parent_ref;<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> carer_observer_imple(carer_subject_parent carer_subject_parent_ref) {<br />         </span><span style="color: #0000ff;">super</span><span style="color: #000000;">();<br />         </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.carer_subject_parent_ref </span><span style="color: #000000;">=</span><span style="color: #000000;"> carer_subject_parent_ref;<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> show_info() {<br />         System.out.println(carer_subject_parent_ref.get_state());<br /> <br />     }<br /> <br /> }</span></div> <p><br /> 新徏客户端运行类Q?/p> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">package</span><span style="color: #000000;"> run_main;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> carer_observer.carer_observer_imple;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> carer_subject.carer_subject_parent;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> carer_subject.carer_subject_sub;<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> run_main {<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {<br /> <br />         carer_subject_parent carer_subject_parent_ref </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> carer_subject_sub();<br /> <br />         carer_observer_imple carer_observer_imple_ref1 </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> carer_observer_imple(<br />                 carer_subject_parent_ref);<br />         carer_observer_imple carer_observer_imple_ref2 </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> carer_observer_imple(<br />                 carer_subject_parent_ref);<br />         carer_observer_imple carer_observer_imple_ref3 </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> carer_observer_imple(<br />                 carer_subject_parent_ref);<br />         carer_observer_imple carer_observer_imple_ref4 </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> carer_observer_imple(<br />                 carer_subject_parent_ref);<br /> <br />         carer_subject_parent_ref.add_observer(carer_observer_imple_ref1);<br />         carer_subject_parent_ref.add_observer(carer_observer_imple_ref2);<br />         carer_subject_parent_ref.add_observer(carer_observer_imple_ref3);<br />         carer_subject_parent_ref.add_observer(carer_observer_imple_ref4);<br /> <br />         carer_subject_parent_ref.sub_observer(carer_observer_imple_ref3);<br /> <br />         carer_subject_parent_ref.set_state(</span><span style="color: #000000;">"</span><span style="color: #000000;">到达l点</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /> <br />         carer_subject_parent_ref.notityAllCarer();<br /> <br />     }<br /> <br /> }</span></div> <p><br /> E序q行l果如下Q?/p> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;">到达l点<br /> 到达l点<br /> 到达l点</span></div> <br /> 以一对多的方式进行对一方状态的改变而去通知多方Q观察者模式也叫发?订阅模式Q一方进行发布,而多方进行订阅,和生zM看报U怸P你喜Ƣ订城市晚报Q就会发l你? <img src ="http://www.aygfsteel.com/ocean07000814/aggbug/252085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ocean07000814/" target="_blank">非洲白?/a> 2009-01-20 17:32 <a href="http://www.aygfsteel.com/ocean07000814/articles/252085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>外观模式http://www.aygfsteel.com/ocean07000814/articles/252083.html非洲白?/dc:creator>非洲白?/author>Tue, 20 Jan 2009 09:31:00 GMThttp://www.aygfsteel.com/ocean07000814/articles/252083.htmlhttp://www.aygfsteel.com/ocean07000814/comments/252083.htmlhttp://www.aygfsteel.com/ocean07000814/articles/252083.html#Feedback0http://www.aygfsteel.com/ocean07000814/comments/commentRss/252083.htmlhttp://www.aygfsteel.com/ocean07000814/services/trackbacks/252083.html设计模式-快餐?【外观模式?/strong>

?strong>外观模式应用场景举例
?br /> 比如在玩“极品飞R”q款游戏Q你只需要等待的是倒计时到0时以最快的车速冲到第一名,但游戏者根本没有想q在车冲出去之前要做哪些工作Q比如挂 档,d器,油箱,调整方向{等的微操作Q将q些微操作封装v来变成一个接口就是外观模式了。在WEB开发中的MVC分层架构是典型的一个外观模 式,每一层将操作的具体内定w藏v来,保留一个接口供上层调用?br />
?strong>外观模式解释?br /> cdQ结构模?br />   为子pȝ中的一l接口提供一个一致的interface接口界面?br />
?strong>外观模式UML?/strong>?br />

?strong>外观模式-JAVA代码实现?br /> 新徏赛Rc:
package car_package;

public class car {

    
public void start() {
        System.out.println(
"车子已启?/span>");
    }

    
public void check_stop() {
        System.out.println(
"刹R?/span>");
    }

    
public void check_box() {
        System.out.println(
"查a?/span>");
    }

    
public void check_console() {
        System.out.println(
"查A表盘是否异常");
    }

}


新徏赛R操作的外观类Q?/p>

package car_facade;

import car_package.car;

public class car_facade_imple {

    
public void car_go_go(car car_ref) {
        car_ref.check_box();
        car_ref.check_console();
        car_ref.check_stop();
        car_ref.start();
    }

}

 

  新徏客户端运行类Q?/p>

package run_main;

import car_facade.car_facade_imple;
import car_package.car;

public class run_main {

    
public static void main(String[] args) {
        car_facade_imple car_facade_imple_ref 
= new car_facade_imple();
        car_facade_imple_ref.car_go_go(
new car());
    }

}


E序q行l果如下Q?/p>

查a?br /> 查A表盘是否异常
刹R?br /> 车子已启?/span>

很简单吧Q将子操作用一个外观接口封装v来,然后调用q个接口是调用那些非常复杂的微操作了?br />

]]>
建造者模?/title><link>http://www.aygfsteel.com/ocean07000814/articles/252084.html</link><dc:creator>非洲白?/dc:creator><author>非洲白?/author><pubDate>Tue, 20 Jan 2009 09:31:00 GMT</pubDate><guid>http://www.aygfsteel.com/ocean07000814/articles/252084.html</guid><wfw:comment>http://www.aygfsteel.com/ocean07000814/comments/252084.html</wfw:comment><comments>http://www.aygfsteel.com/ocean07000814/articles/252084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ocean07000814/comments/commentRss/252084.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ocean07000814/services/trackbacks/252084.html</trackback:ping><description><![CDATA[<span style="color: #008000;"><span style="color: #000000;"><strong>设计模式-快餐?【徏造者模式?/strong><br /> </span></span><br /> ?strong>建造者模式应用场景D?/strong>?br /> 比如在玩“极品飞R”q款游戏Q那么每一关的地图会千变万化,单的来说Q地图会有晴天和阴天之分Q那么创建地图时pҎ晴天或者阴天来对地图上? 场景Q比如:天空Q树Q房子,和\面进行渲染,q个q程是一个固定的Q每创徏一个新地图都要执行q几个渲染,q是针对高配置的电脑来说的?br /> 现在拥有低配|电脑的Z在少敎ͼ那么他们׃能玩游戏了吗Q完全可以!只要地图中占用资源比较高的渲染L可以,比如带反光q树,q时候需要创Z同的地图Q但地图的创E却是固定的Q徏造者模式完全可以应对这L情况?br /> <br /> ?strong><strong>建造?/strong>模式解释</strong>?br /> <span style="color: #ff0000;">cdQ创建模?br /> </span>  一个复杂对象的构徏与它的表C分,使得同样的构E可以创Z同的表示?br /> <br /> ?strong><strong>建造?/strong>模式UML?/strong>?br /> <img alt="" src="../../images/blogjava_net/ghyghost/35864/o_builder.gif" border="0" /><br /> <br /> ?strong><strong>建造?/strong>模式-JAVA代码实现</strong>?br /> 新徏地图接口Q? <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">package</span><span style="color: #000000;"> map_package;<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> map_interface {<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> create_weather();<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> create_house();<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> create_tree();<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> create_way();<br /> <br /> }</span></div> <p><br /> 新徏晴天地图c:</p> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">package</span><span style="color: #000000;"> map_package;<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> map_sun </span><span style="color: #0000ff;">implements</span><span style="color: #000000;"> map_interface {<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> create_weather() {<br />         System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">晴天</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> create_house() {<br />         System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">房了上玻璃发?/span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> create_tree() {<br />         System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">树的颜色是浅l色</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> create_way() {<br />         System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">路面有些q燥</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />     }<br /> <br /> }</span></div> <p> </p> <p>  新徏阴天地图c:</p> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">package</span><span style="color: #000000;"> map_package;<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> map_cloudy </span><span style="color: #0000ff;">implements</span><span style="color: #000000;"> map_interface{<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> create_weather() {<br />         System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">阴天</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> create_house() {<br />         System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">房了上玻璃发?/span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> create_tree() {<br />         System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">树的颜色是深l色</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> create_way() {<br />         System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">路面有些潮湿</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />     }<br /> <br /> }</span></div> <p><br /> 新徏高画质builder建造者类Q?/p> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">package</span><span style="color: #000000;"> map_build;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> map_package.map_interface;<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> map_build_adv {<br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> map_interface map_interface_ref;<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> map_build_adv(map_interface map_interface_ref) {<br />         </span><span style="color: #0000ff;">super</span><span style="color: #000000;">();<br />         </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.map_interface_ref </span><span style="color: #000000;">=</span><span style="color: #000000;"> map_interface_ref;<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> create_map() {<br />         System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">创徏一个高画质的地?/span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> 创徏的顺序很重要 从天I往路面创徏</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        map_interface_ref.create_weather();<br />         map_interface_ref.create_house();<br />         map_interface_ref.create_tree();<br />         map_interface_ref.create_way();<br /> <br />     }<br /> <br /> }</span></div> <p><br /> 新徏低画质builder建造者类Q?/p> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">package</span><span style="color: #000000;"> map_build;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> map_package.map_interface;<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> map_build_low {<br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> map_interface map_interface_ref;<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> map_build_low(map_interface map_interface_ref) {<br />         </span><span style="color: #0000ff;">super</span><span style="color: #000000;">();<br />         </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.map_interface_ref </span><span style="color: #000000;">=</span><span style="color: #000000;"> map_interface_ref;<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> create_map() {<br />         System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">创徏一个低画质的地?/span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> 创徏的顺序很重要 从天I往路面创徏</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        map_interface_ref.create_weather();<br />         map_interface_ref.create_house();<br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> map_interface_ref.create_tree();创建树的过E去?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        map_interface_ref.create_way();<br /> <br />     }<br /> <br /> }</span></div> <p><br /> 新徏客户端运行类Q?/p> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">package</span><span style="color: #000000;"> run_main;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> map_build.map_build_adv;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> map_build.map_build_low;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> map_package.map_cloudy;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> map_package.map_sun;<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> run_main {<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {<br /> <br />         map_cloudy map_cloudy </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> map_cloudy();<br />         map_build_adv map_build_adv </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> map_build_adv(map_cloudy);<br />         map_build_adv.create_map();<br /> <br />         System.out.println();<br /> <br />         map_sun map_sun </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> map_sun();<br />         map_build_low map_build_low </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> map_build_low(map_sun);<br />         map_build_low.create_map();<br /> <br />     }<br /> <br /> }</span></div> <p><br /> E序q行l果如下Q?/p> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;">创徏一个高画质的地?br /> 阴天<br /> 房了上玻璃发?br /> 树的颜色是深l色<br /> 路面有些潮湿<br /> <br /> 创徏一个低画质的地?br /> 晴天<br /> 房了上玻璃发?br /> 路面有些q燥</span></div> <p><br /> 从程序中可以看到Q徏造者模式将不变的创E进行封装,创徏的过E与main分法q行分离Q这样内部的创徏q程和表示层的代码q行分开Q有利于? E功能上的修攏V另外可以发玎ͼ代码的设计和功能有些cM于facade外观模式Q区别在于,建造者模式目的在于以相同的构E通过不同的徏造者得 C同的l果Q而外观模式ƈ不需要不同的建造者,也不希望得到不同的结果,只是单的几个接口合q成高的一个接口,不媄响原有的l果Q目的是使调用变 得更加容易?/p> <p>  本程序中?个徏造者:高画者徏造者和低画质徏造者,它们都封装了创徏地图的过E,q个q程很固定,但通过不同的徏造者类可以q回不样式的地图Q徏造者规定了对象创徏的过E,比如高画质的建造者的创徏q程为:<br /> map_interface_ref.create_weather();<br /> map_interface_ref.create_house();<br /> map_interface_ref.create_tree();<br /> map_interface_ref.create_way();<br /> 必须得执?个方法才可以创徏一个高画质的地图,如果不用徏造者模式,直接调用mapcȝcreate_xxxxҎQ如果create_xxxx Ҏ有几十个Q那么很有可能就把其中的某些Ҏ忘记调用而媄响最l地囄效果了,所以我们要使用建造者模式来规定地图创徏的过E,q就是一?#8220;行ؓ守则 ”?/p> <br /> <img src ="http://www.aygfsteel.com/ocean07000814/aggbug/252084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ocean07000814/" target="_blank">非洲白?/a> 2009-01-20 17:31 <a href="http://www.aygfsteel.com/ocean07000814/articles/252084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模板Ҏ模式http://www.aygfsteel.com/ocean07000814/articles/252082.html非洲白?/dc:creator>非洲白?/author>Tue, 20 Jan 2009 09:29:00 GMThttp://www.aygfsteel.com/ocean07000814/articles/252082.htmlhttp://www.aygfsteel.com/ocean07000814/comments/252082.htmlhttp://www.aygfsteel.com/ocean07000814/articles/252082.html#Feedback0http://www.aygfsteel.com/ocean07000814/comments/commentRss/252082.htmlhttp://www.aygfsteel.com/ocean07000814/services/trackbacks/252082.html设计模式-快餐?【模板方法模式?/strong>

?strong>模板Ҏ模式应用场景举例
?br /> 比如在玩“极品飞R”q款游戏Q每辆R都有昄速度的A表盘Q但有可能A车显C的是蓝色的仪表盘,B车显C的是红色的仪表盘,分析中可以发玎ͼ他们? 有R速度的|但显C的方式不太一栗其实模板方法就是最典型?#8220;l承”的用,大家qx癑ֈN可以用到Q只是不知道叫模板方法模式:Q!

?strong>模板Ҏ模式解释?br /> cdQ行为模?br />   模板Ҏ模式定义一个操作中法的骨Ӟ而将一些步骤gq到子类中,使得子类可以不改变一个算法的l构卛_重定义该法的某些特定步骤?br />
?strong>模板Ҏ模式UML?/strong>?br />

?strong>模板Ҏ模式-JAVA代码实现?br /> 新徏赛R的父c:
package car_package;

public class car_parent {

    
private int speed;

    
public int getSpeed() {
        
return speed;
    }

    
public void setSpeed(int speed) {
        
this.speed = speed;
    }

    
public void print_speed() {
        System.out.println(
"速度" + this.getSpeed() + "取出来!");

    }

}


新徏U色仪表盘的赛R实现c:

package car_imple;

import car_package.car_parent;

public class car_imple_red extends car_parent {

    @Override
    
public void print_speed() {
        
super.print_speed();
        System.out.println(
"速度" + this.getSpeed() + "用红色的仪表盘显CR的速度");
    }

}


新徏蓝色仪表盘的赛R实现c:

package car_imple;

import car_package.car_parent;

public class car_imple_blue extends car_parent {

    @Override
    
public void print_speed() {
        
super.print_speed();
        System.out.println(
"速度" + this.getSpeed() + "用蓝色的仪表盘显CR的速度");
    }

}

 

  新徏客户端运行类Q?/p>

package run_main;

import car_imple.car_imple_blue;
import car_imple.car_imple_red;
import car_package.car_parent;

public class run_main {

    
public static void main(String[] args) {

        car_parent car_ref_red 
= new car_imple_red();
        car_ref_red.setSpeed(
300);
        car_ref_red.print_speed();

        car_parent car_ref_blue 
= new car_imple_blue();
        car_ref_blue.setSpeed(
400);
        car_ref_blue.print_speed();

    }

}


E序q行l果如下Q?/p>

速度300取出来!
速度300用红色的仪表盘显CR的速度
速度400取出来!
速度400用蓝色的仪表盘显CR的速度

q就是模板方法模式,一个最常用Q最Ҏ理解的一个模式,相同的功能抽象出来成一个父c,然后用子cd不同功能的实现?

]]>
原型模式http://www.aygfsteel.com/ocean07000814/articles/252081.html非洲白?/dc:creator>非洲白?/author>Tue, 20 Jan 2009 09:28:00 GMThttp://www.aygfsteel.com/ocean07000814/articles/252081.htmlhttp://www.aygfsteel.com/ocean07000814/comments/252081.htmlhttp://www.aygfsteel.com/ocean07000814/articles/252081.html#Feedback0http://www.aygfsteel.com/ocean07000814/comments/commentRss/252081.htmlhttp://www.aygfsteel.com/ocean07000814/services/trackbacks/252081.html设计模式-快餐?【原型模式?/strong>

?strong>原型模式应用场景举例
?br /> 比如在玩“极品飞R”q款游戏Q每个游戏者都有自q账号用来标识玩家Q而每个玩安可以拥有相同的R辆,q样每个玩家都拥有相同的车,比如你的领居 有奥qA6Q你的老婆对你_我也要开和邻居一L奥_A6Q好了,现在你们家也有奥qA6了,你们每天开着自己的RM班,那么在这U情况下可以应? 原型模式了,原型模式很简单哟Q)是cȝcopy复制?br />
?strong>原型模式解释?br /> cdQ创建模?br />   用原型实例制定创建对象的U类Qƈ且通过拯q些原型创徏新的对象?br />
?strong>原型模式UML?/strong>?br />

?strong>原型模式-JAVA代码实现?br /> 新徏赛R的接口:
package car_interface;

public interface car_interface {

    
public void start();

    
public void stop();
}


新徏奥_汽R的实现类Q?/p>

package car_imple;

import car_fittings.car_tyre;
import car_interface.car_interface;

public class audi_imple implements car_interface, Cloneable {

    
private car_tyre car_tyre_ref;

    
public void start() {
        System.out.println(
"奥_A6启动?/span>");

    }

    
public void stop() {
        System.out.println(
"奥_A6停止?/span>");

    }

    
public car_tyre getCar_tyre_ref() {
        
return car_tyre_ref;
    }

    
public void setCar_tyre_ref(car_tyre car_tyre_ref) {
        
this.car_tyre_ref = car_tyre_ref;
    }

    @Override
    
public Object clone() throws CloneNotSupportedException {
        
super.clone();
        audi_imple audi_imple 
= new audi_imple();
        audi_imple.setCar_tyre_ref(
new car_tyre());

        
return audi_imple;
    }
}

  在奥q汽车实现类中需要注意的是将原来protectedcd的cloneҎ要变成publicQ这h可以对外公开Q可以被调用Q将U密公开化?br />
新徏奥_汽R的配件轮胎类Q?/p>

package car_fittings;

public class car_tyre {

    
private String name = "德国刉原版轮?/span>";

    
public String getName() {
        
return name;
    }

}

 

  新徏客户端运行类Q?/p>

package run_main;

import car_fittings.car_tyre;
import car_imple.audi_imple;
import car_interface.car_interface;

public class run_main {

    
public static void main(String[] args) {

        
try {
            audi_imple car_ref_my 
= new audi_imple();
            car_ref_my.setCar_tyre_ref(
new car_tyre());
            System.out.println(
"我的奥_车的参数是:" + car_ref_my);
            System.out.println(
"我的奥_车的轮胎参数是:" + car_ref_my.getCar_tyre_ref());

            audi_imple car_ref_other 
= (audi_imple) car_ref_my.clone();
            System.out.println(
"其它人的奥_车的参数是:" + car_ref_other);
            System.out.println(
"其它人的奥_车的轮胎参数是:"
                    
+ car_ref_other.getCar_tyre_ref());

        } 
catch (CloneNotSupportedException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}


E序q行l果如下Q?/p>

 

我的奥_车的参数是:car_imple.audi_imple@9cab16
我的奥_车的轮胎参数是:car_fittings.car_tyre@1a46e30
其它人的奥_车的参数是:car_imple.audi_imple@3e25a5
其它人的奥_车的轮胎参数是:car_fittings.car_tyre@19821f

从打印的l果来看Q我的汽车我的轮胎和其它人的汽R和轮胎都是不一L对象Q但“cd”都是一LQ奥q的汽RQ原版的轮胎。本例中也实C“原型? ?#8221;中的“深拷?深复?#8221;Q即汽RcM有一个对?#8220;轮胎”对象Q关于深拯/深复制的概念请参考其它的资料。原型模式通常都是在复制对象的时候用,? 在常规的情况下都是用new重新创徏一个,q且重新对属性进行复Ӟ代码重复度很高,原型模式的出现避免了new的硬操作?br />

]]>
装饰模式http://www.aygfsteel.com/ocean07000814/articles/252078.html非洲白?/dc:creator>非洲白?/author>Tue, 20 Jan 2009 09:27:00 GMThttp://www.aygfsteel.com/ocean07000814/articles/252078.htmlhttp://www.aygfsteel.com/ocean07000814/comments/252078.htmlhttp://www.aygfsteel.com/ocean07000814/articles/252078.html#Feedback0http://www.aygfsteel.com/ocean07000814/comments/commentRss/252078.htmlhttp://www.aygfsteel.com/ocean07000814/services/trackbacks/252078.html装饰模式应用场景举例?br /> 比如在玩“极品飞R”q款游戏Q游戏中有对汽Rq行h鸦的功能Q而且q个h鸦是可以覆盖的,q且覆盖的顺序也影响到最后Rw的昄效果Q假讄在喷涂鸦h2U样式:
Q?Q红色火焰 Q?Q色霞?br /> 如果使用“l承父类”设计q样的功能,那么cd像如下的这P

从图中可以看C用承来实现q种功能Qƈ且是2U涂鸦样式,需要创?个子c,如果h鸦有3U,4U呢Q这U情况就是典型中学课E学习过?#8220;排列与组?#8221;Q那直就?#8220;Head First设计模式”书中讲的“cȝ?#8221;?br /> 昄l承“奥_汽Rc?#8221;的这个办法是无效Q而且是非常徒劻IJ琐的?br /> 那么如何才能?#8220;灉|”Q?#8220;序敏感”q样的需求来实现q样的功能呢Q?br />
?strong>装饰模式解释?br /> cdQ结构模?br />   动态的对一个对象进行功能上的扩展,也可以对其子c进行功能上的扩展?br />
?strong>装饰模式UML?/strong>?br />

?strong>装饰模式-JAVA代码实现?br /> 新徏一个抽象汽车父c:
package car_package;

public abstract class car_parent {
    
// 汽R抽象父类
    private String make_address;
    
private int speed;

    
public String getMake_address() {
        
return make_address;
    }

    
public void setMake_address(String make_address) {
        
this.make_address = make_address;
    }

    
public int getSpeed() {
        
return speed;
    }

    
public void setSpeed(int speed) {
        
this.speed = speed;
    }

    
public abstract void print_face();

}


然后新徏一个奥q汽车子c:

package car_package;

public class audi_sub extends car_parent {
    
// 奥_汽R子类

    @Override
    
public void print_face() {
        System.out.println(
"audi车默认的颜色为 黑色");
    }

}


然后再新Z个装饰者父c:

package decorator_package;

import car_package.car_parent;

public abstract class decorator_parent extends car_parent {
    
// 装饰者父c?/span>

    
protected car_parent car_parent_ref;

    
public void setCar_parent_ref(car_parent car_parent_ref) {
        
this.car_parent_ref = car_parent_ref;
    }

    @Override
    
public void print_face() {
        car_parent_ref.print_face();
    }

}


然后再新饰者子c:U色火焰装饰者类Q?/p>

package decorator_package;

public class decorator_audi_red extends decorator_parent {

    @Override
    
public void print_face() {
        
super.print_face();
        System.out.println(
"l 奥_ h鸦 - 颜色为 U色火焰");
    }

}


然后再新饰者子c:紫色霞光装饰者类Q?br />

package decorator_package;

public class decorator_audi_purple extends decorator_parent {

    @Override
    
public void print_face() {
        
super.print_face();
        System.out.println(
"l 奥_ h鸦 - 颜色为 紫色霞光");
    }

}


新徏一个运行类Q?/p>

package main_run;

import car_package.audi_sub;
import decorator_package.decorator_audi_purple;
import decorator_package.decorator_audi_red;

public class main_run {

    
public static void main(String[] args) {

        audi_sub audi_sub_ref 
= new audi_sub();
        audi_sub_ref.setMake_address(
"北京市朝阛_");
        audi_sub_ref.setSpeed(
200);

        decorator_audi_red decorator_audi_red_ref 
= new decorator_audi_red();
        decorator_audi_red_ref.setCar_parent_ref(audi_sub_ref);

        decorator_audi_purple decorator_audi_purple_ref 
= new decorator_audi_purple();
        decorator_audi_purple_ref.setCar_parent_ref(decorator_audi_red_ref);

        decorator_audi_purple_ref.print_face();

    }
}


E序q行l果如下Q?br />

audi车默认的颜色为 黑色
l 奥_ h鸦 
- 颜色为 U色火焰
l 奥_ h鸦 
- 颜色为 紫色霞光

从程序结构中可以看到Q完全符合了前面我们的要求:“灉|”Q?#8220;序敏感”?

]]>
{略模式http://www.aygfsteel.com/ocean07000814/articles/252079.html非洲白?/dc:creator>非洲白?/author>Tue, 20 Jan 2009 09:27:00 GMThttp://www.aygfsteel.com/ocean07000814/articles/252079.htmlhttp://www.aygfsteel.com/ocean07000814/comments/252079.htmlhttp://www.aygfsteel.com/ocean07000814/articles/252079.html#Feedback0http://www.aygfsteel.com/ocean07000814/comments/commentRss/252079.htmlhttp://www.aygfsteel.com/ocean07000814/services/trackbacks/252079.html设计模式-快餐?【策略模式?/strong>

?strong>{略模式应用场景举例
?br /> 比如在玩“极品飞R”q款游戏Q那么游戏对车的轮胎是可以更换的Q不同的轮胎在高速{弯时有不同的痕迹样式Q那么针?#8220;汽R”的配?#8220;轮胎”p可以变化Q而且轮胎和轮胎之间是可以怺替换的,q就是典型的要应?#8220;{略模式”的场景!

?strong>{略模式解释?br /> cdQ行为模?br />   定义一l算法,每个算法都装hQƈ且它们之间可以互换。策略模式ɘq些法在客L调用它们的时候能够互不媄响地变化?br />
?strong>{略模式UML?/strong>?br />
?strong>{略模式-JAVA代码实现?br /> 从策略模式UML图中可以看到Context与接口Strategy是组合关p,卛_引用关系?br />
新徏一个轮胎接口:
package strategy_interface;

public interface tyre_interface {

    
// tyre 轮胎
    public void print_tyre_line();// 昄胎的痕迹

}

新徏2个轮胎接口的实现c:
package strategy_implement;

import strategy_interface.tyre_interface;

//长痕q轮胎类
public class tyre_long_implement implements tyre_interface {

    
public void print_tyre_line() {
        System.out.println(
"在\面上昄一个长轮胎痕迹");
    }

}

package strategy_implement;

import strategy_interface.tyre_interface;

//短痕q轮胎类
public class tyre_short_implement implements tyre_interface {

    
public void print_tyre_line() {
        System.out.println(
"在\面上昄一个短轮胎痕迹");
    }

}

Z一个轮胎接口来实现不同样式的轮胎样式?br />
l装一个Car车类Q?br />
package car_package;

import strategy_interface.tyre_interface;

public class Car {

    
private String make_address;// 刉地
    private int death_year;// 报废q限
    private int speed;// 速度
    private tyre_interface tyre_interface_ref;// 轮胎的样?/span>

    
public String getMake_address() {
        
return make_address;
    }

    
public void setMake_address(String make_address) {
        
this.make_address = make_address;
    }

    
public int getDeath_year() {
        
return death_year;
    }

    
public void setDeath_year(int death_year) {
        
this.death_year = death_year;
    }

    
public int getSpeed() {
        
return speed;
    }

    
public void setSpeed(int speed) {
        
this.speed = speed;
    }

    
public tyre_interface getTyre_interface_ref() {
        
return tyre_interface_ref;
    }

    
public void setTyre_interface_ref(tyre_interface tyre_interface_ref) {
        
this.tyre_interface_ref = tyre_interface_ref;
    }

    
public void start() {

        System.out.println(
"车的基本信息为:");
        System.out.println(
"刉地make_addressQ?/span>" + this.getMake_address());
        System.out.println(
"报废q限death_yearQ?/span>" + this.getDeath_year());
        System.out.println(
"速度speedQ?/span>" + this.getSpeed());

        System.out.println(
"Car 起动了!");

        System.out.println(
"Car高速行Ӟ遇到一个大转弯Q\面显C:");
        
this.getTyre_interface_ref().print_tyre_line();

    }
}

让R跑v来,q且h更换轮胎样式的功能:
package main_run;

import strategy_implement.tyre_long_implement;
import strategy_implement.tyre_short_implement;
import car_package.Car;

public class run_main {

    
public static void main(String[] args) {

        tyre_long_implement tyre_long_implement 
= new tyre_long_implement();
        tyre_short_implement tyre_short_implement 
= new tyre_short_implement();
        Car car 
= new Car();
        car.setDeath_year(
8);
        car.setMake_address(
"北京朝阳?/span>");
        car.setSpeed(
200);
        car.setTyre_interface_ref(tyre_long_implement);
        car.start();

    }
}

控制台打印出Q?br />
车的基本信息为:
刉地make_addressQ北京朝阛_
报废q限death_yearQ?/span>8
速度speedQ?/span>200
Car 起动了!
Car高速行Ӟ遇到一个大转弯Q\面显C:
在\面上昄一个长轮胎痕迹

是一个长轮胎痕迹Q但在程序中可以使用代码Qcar.setTyre_interface_ref(tyre_long_implement);来对 轮胎的样式进行不同的替换Q可以替换成短轮胎痕q的汽R轮胎Q这样在不更改Carcȝ前题下进行了不同轮胎样式的改变,轮胎和轮胎之间可以互相替换,q就 是策略模式?

]]>
代理模式http://www.aygfsteel.com/ocean07000814/articles/252077.html非洲白?/dc:creator>非洲白?/author>Tue, 20 Jan 2009 09:26:00 GMThttp://www.aygfsteel.com/ocean07000814/articles/252077.htmlhttp://www.aygfsteel.com/ocean07000814/comments/252077.htmlhttp://www.aygfsteel.com/ocean07000814/articles/252077.html#Feedback0http://www.aygfsteel.com/ocean07000814/comments/commentRss/252077.htmlhttp://www.aygfsteel.com/ocean07000814/services/trackbacks/252077.html代理模式应用场景举例?br /> 比如在玩“极品飞R”q款游戏Q如果游戏者手中的金钱辑ֈ了一定的数量可以到车店C部性能更高的赛车,那么q个卖R?#8220;车店”是一个典型的“? 车厂?#8221;?#8220;代理”Q他为汽车厂?#8220;提供卖R的服?#8221;l有需求的人士。从面向对象的方面考虑Q?#8220;销售汽车的代理”也是一个对象,那么q个对象也具有一定的 状态,在Y仉目中q个对象也具有管理胦务进销存的基本功能Q那么在设计时就要以面向OOP~程的思想来考虑软g的类l构Q这个销售汽车的代理也是一个类 了?br />
?strong>代理模式解释?br /> cdQ结构模?br />   对一些对象提供代理,以限刉些对象去讉K其它对象?br />
?strong>代理模式UML?/strong>?br />

?strong>代理模式-JAVA代码实现?br /> 新徏一个买车的接口Q?
package buy_car_package;

public interface buy_car_package {

    
public void buy_car();
}


新徏一个people人类Q具有买车的行ؓQ所以实现接口buy_car_packageQ?/p>

package buy_car_imple;

import buy_car_package.buy_car_package;

public class people implements buy_car_package {

    
private int cash;
    
private String username;

    
public int getCash() {
        
return cash;
    }

    
public void setCash(int cash) {
        
this.cash = cash;
    }

    
public String getUsername() {
        
return username;
    }

    
public void setUsername(String username) {
        
this.username = username;
    }

    
public void buy_car() {
        System.out.println(username 
+ "C一台新?/span>");
    }

}


peoplecM能拥有RQ必ȝqproxy代理cȝ认证Q符合条件之后才可以拥有车辆Q新Z个代理,q个代理cL考察当前的people是否有资D行买车:

package buy_car_imple;

import buy_car_package.buy_car_package;

public class proxy_buy_car_imple implements buy_car_package {

    
private people people;

    
public people getPeople() {
        
return people;
    }

    
public void setPeople(people people) {
        
this.people = people;
    }

    
public void buy_car() {
        
if (people.getCash() > 3000) {
            System.out.print(
"汽R商店帮:");
            people.buy_car();
        } 
else {
            System.out.println(people.getUsername() 
+ "金钱不够Q请l箋比赛!");
        }
    }

}


最后创Z个客LQ用来模拟买车的行ؓQ?/p>

package run_main;

import buy_car_imple.people;
import buy_car_imple.proxy_buy_car_imple;

public class run_main {
    
public static void main(String[] args) {
        people people_ref1 
= new people();
        people_ref1.setCash(
4000);
        people_ref1.setUsername(
"高洪?/span>");

        people people_ref2 
= new people();
        people_ref2.setCash(
2000);
        people_ref2.setUsername(
"岩洪?/span>");

        proxy_buy_car_imple proxy_buy_car_imple 
= new proxy_buy_car_imple();
        proxy_buy_car_imple.setPeople(people_ref1);
        proxy_buy_car_imple.buy_car();

        proxy_buy_car_imple.setPeople(people_ref2);
        proxy_buy_car_imple.buy_car();

    }
}


E序q行l果如下Q?/p>

高洪岩花4000块 C新R 交易l束
岩洪高金׃够,Ll比?/span>!

q样people׃可能自由的拥有R辆,必须l过proxy的认证之后才可以?br /> 而代理模式在GOF四h帮的介绍中大体有4U用情景:
Q?Q远E代理。典型的是客户端与webservice使用的情况,客户端由于是针对OOP~程Q而不是针对webservice中的Ҏq行~? E,所以得在客L模拟一下webservice的环境,用proxy来对webserviceq行包装Q这样就可以使用proxy代理cLq程操作 webservice了?br /> Q?Q虚拟代理。比如你要开发一个大文档查看软gQ大文档中有大的囄Q有可能一个图片有100MBQ在打开文g时不可能所有的囄都显C出来,q样可以用代理模式,当需要查看图片时Q用proxy来进行大囄的打开?br /> Q?Q安全代理。其实也是本例中所丄买R的例子,金钱不够不可以买车!
Q?Q智能指引。比如在讉K一个对象时其是否被锁定等情况?

]]>
工厂Ҏ模式http://www.aygfsteel.com/ocean07000814/articles/252076.html非洲白?/dc:creator>非洲白?/author>Tue, 20 Jan 2009 09:24:00 GMThttp://www.aygfsteel.com/ocean07000814/articles/252076.htmlhttp://www.aygfsteel.com/ocean07000814/comments/252076.htmlhttp://www.aygfsteel.com/ocean07000814/articles/252076.html#Feedback0http://www.aygfsteel.com/ocean07000814/comments/commentRss/252076.htmlhttp://www.aygfsteel.com/ocean07000814/services/trackbacks/252076.html工厂Ҏ模式应用场景举例?br /> 比如在玩“极品飞R”q款游戏Q晕了吧Q我喜欢极品飞RQ)Q在玩这ƾ游戏时Q游戏者可以选择从不同品牌来选择赛RQ那么这?#8220;品牌”其实也就是工厂,每个工厂生的赛车都不一Pq就是典型的工厂Ҏ的应用场景?br />
?strong>工厂Ҏ模式解释?br /> cdQ创建模?br />   定义一个用于创建对象的接口Q让其子cL军_实例化哪一个类Q品)Q工厂方法一个类的创建gq到其子cM?br />
?strong>工厂Ҏ模式UML?/strong>?br />

?strong>工厂Ҏ模式-JAVA代码实现?br /> 新徏赛R的接口:
package car_interface;

public interface Icar_interface {

    
public void start();

    
public void stop();

}


新徏1个汽车信息的基类Q?/p>

package car_imple;

import car_interface.Icar_interface;

public class base_car_imple implements Icar_interface {

    
private int speed;

    
private String name;

    
public int getSpeed() {
        
return speed;
    }

    
public void setSpeed(int speed) {
        
this.speed = speed;
    }

    
public String getName() {
        
return name;
    }

    
public void setName(String name) {
        
this.name = name;
    }

    
public void start() {
        
// TODO Auto-generated method stub

    }

    
public void stop() {
        
// TODO Auto-generated method stub

    }

}


新徏奥_汽R实现c:

package car_imple;

import car_interface.Icar_interface;

public class car_audi_imple extends base_car_imple {

    
public void start() {
        System.out.println(
this.getName() + " 车以专利技术v动了 最高速度为:"
                
+ this.getSpeed());
    }

    
public void stop() {
        System.out.println(
this.getName() + " 车以专利技术停车了");
    }

}


新徏大众汽R实现c:

package car_imple;

import car_interface.Icar_interface;

public class car_3w_imple extends base_car_imple {

    
public void start() {
        System.out.println(
this.getName() + " 车以专利技术v动了 最高速度为:"
                
+ this.getSpeed());
    }

    
public void stop() {
        System.out.println(
this.getName() + " 车以专利技术停车了");
    }

}


新徏一个汽车工厂接口:

package car_factory_interface;

import car_interface.Icar_interface;

public interface Icar_factory {

    
public Icar_interface create_car();

}


新徏一个创建奥qR的汽车工厂实现类Q?/p>

package car_factory_imple;

import car_factory_interface.Icar_factory;
import car_imple.car_audi_imple;
import car_interface.Icar_interface;

public class audi_car_factory_imple implements Icar_factory {

    
public Icar_interface create_car() {

        car_audi_imple car_audi_imple_ref 
= new car_audi_imple();
        car_audi_imple_ref.setName(
"奥_A6");
        car_audi_imple_ref.setSpeed(
300);

        
return car_audi_imple_ref;
    }
}


新徏一个创建大众R的汽车工厂实现类Q?/p>

package car_factory_imple;

import car_factory_interface.Icar_factory;
import car_imple.car_3w_imple;
import car_imple.car_audi_imple;
import car_interface.Icar_interface;

public class threeW_car_factory_imple implements Icar_factory {

    
public Icar_interface create_car() {

        car_3w_imple car_3w_imple_ref 
= new car_3w_imple();
        car_3w_imple_ref.setName(
"大众A6");
        car_3w_imple_ref.setSpeed(
400);

        
return car_3w_imple_ref;

    }

}


客户端运行程序代码:

package run_main;

import car_factory_imple.audi_car_factory_imple;
import car_factory_interface.Icar_factory;
import car_interface.Icar_interface;

public class run_main {

    
public static void main(String[] args) {

        Icar_factory car_factory 
= new audi_car_factory_imple();
        Icar_interface car_ref 
= car_factory.create_car();
        car_ref.start();
        car_ref.stop();

    }

}


E序q行l果如下Q?/p>

奥_A6 车以专利技术v动了 最高速度为:300
奥_A6 车以专利技术停车了

通过使用工厂Ҏ模式可以将对象的创建gq到子类q行实例化,而且每个工厂创徏不同的品牌的汽RQ每个汽车的功能都有自己“专利”的实玎ͼq样可以不?#8220;品牌”?#8220;汽R”的创行分c,有利于对象创建的清晰性。创Z同的汽R只需要改动这句代码就可以了:
Icar_factory car_factory = new audi_car_factory_imple();

]]>
վ֩ģ壺 | | | »| ָ| | | | | | ¹| | կ| | | ϻ| | | ɽ| | | | ɽ| ƽ| ϲ| ٳ| | Ӣ| | | | | | ԣ| ƽ| | | | | ϳ| ϴ|