锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍏堢湅鐪嬫娊璞¢儴鍒嗙殑鎺ュ彛浠g爜: public abstract class Coffee 鍏朵腑CoffeeImp 鏄姞涓嶅姞濂剁殑琛屼負鎺ュ彛,鐪嬪叾浠g爜濡備笅: public abstract class CoffeeImp 鐜板湪鎴戜滑鏈変簡涓や釜鎶借薄綾?span lang=EN-US>,涓嬮潰鎴戜滑鍒嗗埆瀵瑰叾榪涜緇ф壙,瀹炵幇concrete class:
渚嬪,涓鏉挅鍟′負渚?鏈変腑鏉拰澶ф澂涔嬪垎,鍚屾椂榪樻湁鍔犲ザ 涓嶅姞濂朵箣鍒? 濡傛灉鐢ㄥ崟綰殑緇ф壙,榪欏洓涓叿浣撳疄鐜?涓澂 澶ф澂 鍔犲ザ 涓嶅姞濂?涔嬮棿鏈夋蹇甸噸鍙?鍥犱負鏈変腑鏉姞濂?涔熸湁涓澂涓嶅姞濂? 濡傛灉鍐嶅湪涓澂榪欎竴灞傚啀瀹炵幇涓や釜緇ф壙,寰堟樉鐒舵販涔?鎵╁睍鎬ф瀬宸?閭f垜浠嬌鐢˙ridge妯″紡鏉ュ疄鐜板畠.
濡備綍瀹炵幇?
浠ヤ笂闈㈡彁鍒扮殑鍜栧暋 涓轟緥. 鎴戜滑鍘熸潵鎵撶畻鍙璁′竴涓帴鍙?鎶借薄綾?,浣跨敤Bridge妯″紡鍚?鎴戜滑闇瑕佸皢鎶借薄鍜岃涓哄垎寮,鍔犲ザ鍜屼笉鍔犲ザ灞炰簬琛屼負,鎴戜滑灝嗗畠浠娊璞℃垚涓涓笓闂ㄧ殑琛屼負鎺ュ彛.
紼嬪簭涓句緥錛?br>
{
銆銆CoffeeImp coffeeImp;
銆銆public void setCoffeeImp() {
銆銆銆銆this.CoffeeImp = CoffeeImpSingleton.getTheCoffeImp();
銆銆}
銆銆public CoffeeImp getCoffeeImp() {return this.CoffeeImp;}
銆銆public abstract void pourCoffee();
}
{
銆銆public abstract void pourCoffeeImp();
}
//涓澂 //澶ф澂 |
涓婇潰鍒嗗埆鏄腑鏉拰澶ф澂鐨勫叿浣撳疄鐜?span lang=EN-US>.涓嬮潰鍐嶅琛屼負CoffeeImp榪涜緇ф壙:
//鍔犲ザ //涓嶅姞濂?br>public class FragrantCoffeeImp extends CoffeeImp |
Bridge妯″紡鐨勫熀鏈鏋舵垜浠凡緇忔惌濂戒簡,鍒繕璁板畾涔変腑榪樻湁涓鍙?鍔ㄦ佺粨鍚?鎴戜滑鐜板湪鍙互鍠濆埌鑷沖皯鍥涚鍜栧暋:
1.涓澂鍔犲ザ
2.涓澂涓嶅姞濂?br>3.澶ф澂鍔犲ザ
4.澶ф澂涓嶅姞濂?o:p>
鐪嬬湅鏄浣曞姩鎬佺粨鍚堢殑,鍦ㄤ嬌鐢ㄤ箣鍓?鎴戜滑鍋氫釜鍑嗗宸ヤ綔,璁捐涓涓崟鎬佺被(Singleton)鐢ㄦ潵hold褰撳墠鐨凜offeeImp:
public class CoffeeImpSingleton |
鐪嬬湅涓澂鍔犲ザ 鍜屽ぇ鏉姞濂?鏄庝箞鍑烘潵鐨?span lang=EN-US>:
//鎷垮嚭鐗涘ザ
CoffeeImpSingleton coffeeImpSingleton = new CoffeeImpSingleton(new MilkCoffeeImp());
//涓澂鍔犲ザ
MediumCoffee mediumCoffee = new MediumCoffee();
mediumCoffee.pourCoffee();
//澶ф澂鍔犲ザ
SuperSizeCoffee superSizeCoffee = new SuperSizeCoffee();
superSizeCoffee.pourCoffee();
娉ㄦ剰: Bridge妯″紡鐨勬墽琛岀被濡侰offeeImp鍜孋offee鏄竴瀵逛竴鐨勫叧緋? 姝g‘鍒涘緩CoffeeImp鏄妯″紡鐨勫叧閿?
涓轟粈涔堜嬌鐢?span lang=EN-US>Decorator?
鎴戜滑閫氬父鍙互浣跨敤緇ф壙鏉ュ疄鐜板姛鑳界殑鎷撳睍,濡傛灉榪欎簺闇瑕佹嫇灞曠殑鍔熻兘鐨勭綾誨緢綣佸,閭d箞鍔垮繀鐢熸垚寰堝瀛愮被,澧炲姞緋葷粺鐨勫鏉傛?鍚屾椂,浣跨敤緇ф壙瀹炵幇鍔熻兘鎷撳睍,鎴戜滑蹇呴』鍙瑙佽繖浜涙嫇灞曞姛鑳?榪欎簺鍔熻兘鏄紪璇戞椂灝辯‘瀹氫簡,鏄潤鎬佺殑.
浣跨敤Decorator鐨勭悊鐢辨槸:榪欎簺鍔熻兘闇瑕佺敱鐢ㄦ埛鍔ㄦ佸喅瀹氬姞鍏ョ殑鏂瑰紡鍜屾椂鏈?Decorator鎻愪緵浜?鍗蟲彃鍗崇敤"鐨勬柟娉?鍦ㄨ繍琛屾湡闂村喅瀹氫綍鏃跺鍔犱綍縐嶅姛鑳?
紼嬪簭涓句緥錛?br>Display.java:
public abstract class Display {
public abstract int getColumns(); // 鍙栧緱妯悜鐨勫瓧鏁?/p>
public abstract int getRows(); // 鍙栧緱鐩村悜鐨勮鏁?/p>
public abstract String getRowText(int row); // 鍙栧緱絎瑀ow涓瓧涓?/p>
public final void show() { // 鎵撳嵃鎵鏈夊収瀹?br> for (int i = 0; i < getRows(); i++) {
System.out.println(getRowText(i));
}
}
}
Border .java:
public abstract class Border extends Display {
protected Display display; // 鎸囪楗板妗嗛噷闈㈢殑銆屽収瀹廣?顛?
protected Border(Display display) { // 鍦ㄤ駭鐢熷璞″疄渚嬫椂錛屼互鍙傛暟鎸囧畾銆屽収瀹廣?br> this.display = display;
}
}
public StringDisplay(String string) { // 浠ュ弬鏁版寚瀹氭墦鍗扮殑瀛椾覆
this.string = string;
}
public int getColumns() { // 瀛楁暟
return string.getBytes().length;
}
public int getRows() { // 琛屾暟涓?
return 1;
}
public String getRowText(int row) { // 浠呭湪row涓?鏃舵墠榪斿洖
if (row == 0) {
return string;
} else {
return null;
}
}
}
SideBorder.java:
public class SideBorder extends Border {
private char borderChar; // 瑁呴グ瀛楃
public SideBorder(Display display, char ch) { // 浠ユ瀯閫犲瓙鎸囧畾Display鍜岃楗板瓧絎?
super(display);
this.borderChar = ch;
}
public int getColumns() { // 瀛楁暟瑕佸啀鍔犱笂鍏у涓よ竟鐨勮楗板瓧絎?br> return 1 + display.getColumns() + 1;
}
public int getRows() { // 琛屾暟鍚屽収瀹圭殑琛屾暟
return display.getRows();
}
public String getRowText(int row) { // 鎸囧畾璇ヨ鐨勫収瀹瑰嵆涓哄湪鍏у涔嬫寚瀹氳鐨勪袱杈?br> // 鍔犱笂瑁呴グ瀛楃
return borderChar + display.getRowText(row) + borderChar;
}
}
UpDownBorder .java:
public class UpDownBorder extends Border {
private char borderChar; // 瑁呴グ瀛楃
public UpDownBorder(Display display, char ch) { // 浠ユ瀯閫犲瓙鎸囧畾Display鍜岃楗板瓧絎?br> super(display);
this.borderChar = ch;
}
public int getColumns() { // 瀛楁暟鍚屽収瀹圭殑瀛楁暟
return display.getColumns();
}
public int getRows() { // 琛屾暟瑕佸啀鍔犱笂鍏у涓婁笅鐨勮楗板瓧絎︾殑琛屾暟
return 1 + display.getRows() + 1;
}
public String getRowText(int row) { // 鎸囧畾璇ヨ鐨勫収瀹?br> if (row == 0 || row == getRows() - 1) {
return makeLine(borderChar, getColumns());
} else {
return display.getRowText(row - 1);
}
}
private String makeLine(char ch, int count) { // 浠ュ瓧絎h錛屽緩绔嬮噸澶峜ount嬈$殑榪炵畫瀛椾覆
StringBuffer buf = new StringBuffer();
for (int i = 0; i < count; i++) {
buf.append(ch);
}
return buf.toString();
}
}
浣跨敤Composite
棣栧厛瀹氫箟涓涓帴鍙f垨鎶借薄綾伙紝榪欐槸璁捐妯″紡閫氱敤鏂瑰紡浜嗭紝鍏朵粬璁捐妯″紡瀵規帴鍙e唴閮ㄥ畾涔夐檺鍒朵笉澶氾紝Composite鍗存湁涓瀹氾紝閭e氨鏄鍦ㄦ帴鍙e唴閮ㄥ畾涔変竴涓敤浜庤闂拰綆$悊Composite緇勫悎浣撶殑瀵硅薄浠紙鎴栫О閮ㄤ歡Component錛?
涓嬮潰鐨勪唬鐮佹槸浠ユ娊璞$被瀹氫箟錛屼竴鑸敖閲忕敤鎺ュ彛interface,
public abstract class Equipment |
鎶借薄綾?span>Equipment灝辨槸Component瀹氫箟錛屼唬琛ㄧ潃緇勫悎浣撶被鐨勫璞′滑,Equipment涓畾涔夊嚑涓叡鍚岀殑鏂規硶銆?/span>
public class Disk extends Equipment |
Disk鏄粍鍚堜綋鍐呯殑涓涓璞★紝鎴栫О涓涓儴浠訛紝榪欎釜閮ㄤ歡鏄釜鍗曠嫭鍏冪礌( Primitive)銆?br>榪樻湁涓縐嶅彲鑳芥槸錛屼竴涓儴浠朵篃鏄竴涓粍鍚堜綋錛屽氨鏄榪欎釜閮ㄤ歡涓嬮潰榪樻湁'鍎垮瓙'錛岃繖鏄爲褰㈢粨鏋勪腑閫氬父鐨勬儏鍐碉紝搴旇姣旇緝瀹規槗鐞嗚В銆傜幇鍦ㄦ垜浠厛瑕佸畾涔夎繖涓粍鍚堜綋錛?/span>
abstract class CompositeEquipment extends Equipment 銆銆//娉ㄦ剰榪欓噷錛岃繖閲屽氨鎻愪緵鐢ㄤ簬璁塊棶鑷繁緇勫悎浣撳唴鐨勯儴浠舵柟娉曘?br>銆銆//涓婇潰dIsk 涔嬫墍浠ユ病鏈夛紝鏄洜涓篋isk鏄釜鍗曠嫭(Primitive)鐨勫厓绱? |
涓婇潰CompositeEquipment緇ф壙浜咵quipment,鍚屾椂涓鴻嚜宸遍噷闈㈢殑瀵硅薄浠彁渚涗簡澶栭儴璁塊棶鐨勬柟娉?閲嶈澆浜咺terator,Iterator鏄疛ava鐨凜ollection鐨勪竴涓帴鍙o紝鏄疘terator妯″紡鐨勫疄鐜?
鎴戜滑鍐嶇湅鐪?span>CompositeEquipment鐨勪袱涓叿浣撶被:鐩樼洅Chassis鍜岀瀛怌abinet錛岀瀛愰噷闈㈠彲浠ユ斁寰堝涓滆タ錛屽搴曟澘錛岀數婧愮洅錛岀‖鐩樼洅絳夛紱鐩樼洅閲岄潰鍙互鏀句竴浜涘皬璁懼錛屽紜洏 杞┍絳夈傛棤鐤戣繖涓や釜閮芥槸灞炰簬緇勫悎浣撴ц川鐨勩?/span>
public class Chassis extends CompositeEquipment public class Cabinet extends CompositeEquipment |
鑷蟲鎴戜滑瀹屾垚浜嗘暣涓?span>Composite妯″紡鐨勬灦鏋勩?/span>
鎴戜滑鍙互鐪嬬湅瀹㈡埛绔皟鐢?span>Composote浠g爜:
Cabinet cabinet=new Cabinet("Tower");
Chassis chassis=new Chassis("PC Chassis");
//灝哖C Chassis瑁呭埌Tower涓?(灝嗙洏鐩掕鍒扮瀛愰噷)
cabinet.add(chassis);
//灝嗕竴涓?0GB鐨勭‖鐩樿鍒?PC Chassis (灝嗙‖鐩樿鍒扮洏鐩掗噷)
chassis.add(new Disk("10 GB"));
//璋冪敤 netPrice()鏂規硶;
System.out.println("netPrice="+cabinet.netPrice());
System.out.println("discountPrice="+cabinet.discountPrice());
涓婇潰璋冪敤鐨勬柟娉?span>netPrice()鎴杁iscountPrice()錛屽疄闄呬笂Composite浣跨敤Iterator閬嶅巻浜嗘暣涓爲褰㈢粨鏋?瀵繪壘鍚屾牱鍖呭惈榪欎釜鏂規硶鐨勫璞″茍瀹炵幇璋冪敤鎵ц.
Composite鏄釜寰堝閥濡欎綋鐜版櫤鎱х殑妯″紡錛屽湪瀹為檯搴旂敤涓紝濡傛灉紕板埌鏍戝艦緇撴瀯錛屾垜浠氨鍙互灝濊瘯鏄惁鍙互浣跨敤榪欎釜妯″紡銆?/span>
璁捐妯″紡涓畾涔?/strong>: 涓哄叾浠栧璞℃彁渚涗竴縐嶄唬鐞嗕互鎺у埗瀵硅繖涓璞$殑璁塊棶.瑕佺敤鍐嶅緩绔?br>紼嬪簭涓句緥1錛氭潈闄愯闂?br>
public class ForumProxy implements Forum { private ForumPermissions permissions; public void setName(String name) throws UnauthorizedException, ... }
private Forum forum;
this.authorization = authorization;
public ForumProxy(Forum forum, Authorization authorization,
ForumPermissions permissions)
{
this.forum = forum;
this.authorization = authorization;
this.permissions = permissions;
}
.....
ForumAlreadyExistsException
{
銆銆//鍙湁鏄郴緇熸垨璁哄潧綆$悊鑰呮墠鍙互淇敼鍚嶇О
銆銆if (permissions.isSystemOrForumAdmin()) {
銆銆銆銆forum.setName(name);
銆銆}
銆銆else {
銆銆銆銆throw new UnauthorizedException();
銆銆}
}
鑰?span lang=EN-US>DbForum鎵嶆槸鎺ュ彛Forum鐨勭湡姝e疄鐜?浠ヤ慨鏀硅鍧涘悕縐頒負渚?
public class DbForum implements Forum, Cacheable { public void setName(String name) throws ForumAlreadyExistsException { 銆銆....
} |
鍑℃槸娑夊強鍒板璁哄潧鍚嶇О淇敼榪欎竴浜嬩歡,鍏朵粬紼嬪簭閮介鍏堝緱鍜孎orumProxy鎵撲氦閬?鐢盕orumProxy鍐沖畾鏄惁鏈夋潈闄愬仛鏌愪竴鏍蜂簨鎯?ForumProxy鏄釜鍚嶅壇鍏跺疄鐨?緗戝叧","瀹夊叏浠g悊緋葷粺".
紼嬪簭涓句緥2錛氱敤鍒版墠鍒涘緩
瀹為檯鎵ц鎵撳嵃 涓轟簡妯′豢闀挎椂闂存搷浣?鍦ㄦ瀯寤虹殑鏃跺欏歡榪?S
public class Printer implements Printable {
private String name;
public Printer() {
heavyJob("姝e湪浜х敓Printer鐨勫璞″疄渚?);
}
public Printer(String name) { // 鏋勯犲瓙
this.name = name;
heavyJob("姝e湪浜х敓Printer鐨勫璞″疄渚?" + name + ")");
}
public void setPrinterName(String name) { // 鍛藉悕
this.name = name;
}
public String getPrinterName() { // 鍙栧緱鍚嶇О
return name;
}
public void print(String string) { // 杈撳嚭鍚嶇О
System.out.println("=== " + name + " ===");
System.out.println(string);
}
private void heavyJob(String msg) { // 杈冮噸鐨勫伐浣滐紙鍋囪錛?br> System.out.print(msg);
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.out.print(".");
}
System.out.println("瀹屾垚銆?);
}
}
浠g悊綾伙細鐪熸瑕佹墦鍗頒簡鎵嶅幓璋冪敤鐢熸垚printer騫朵笖鍙傛暟璧嬪艱繘琛屾墦鍗版搷浣?br>public class PrinterProxy implements Printable {
private String name; // 鍚嶇О
private Printable real; // 銆屾湰浜恒?/span>
private String className; // 銆屾湰浜恒嶇殑綾誨悕縐?/span>
public PrinterProxy(String name, String className) { // 鏋勯犲瓙
this.name = name;
this.className = className;
}
public synchronized void setPrinterName(String name) { // 鍛藉悕
if (real != null) {
real.setPrinterName(name); //銆屾湰浜恒嶄篃瑕佸懡鍚?br> }
this.name = name;
}
public String getPrinterName() { // 鍙栧緱鍚嶇О
return name;
}
public void print(String string) { // 杈撳嚭鍒扮敾闈笂
realize();
real.print(string);
}
private synchronized void realize() { // 浜х敓銆屾湰浜恒?br> if (real == null) {
try {
real = (Printable) Class.forName("Proxy." + className)
.newInstance();
real.setPrinterName(name);
} catch (ClassNotFoundException e) {
System.err.println("鎵句笉鍒扮被 " + className + "銆?);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
鏃犺鎬庝箞璋冪敤setPrinterName鏂規硶閮戒笉浼氫駭鐢焤eal瀹炰緥 鍙湁鐪熸闇瑕佺敓鎴愭湰浜虹殑鏃跺欐墠浼氱敓鎴?br>嫻嬭瘯鏂規硶錛?br>public class Main {
public static void main(String[] args) {
Printable p = new PrinterProxy("Alice", "Printer");
System.out.println("鐜板湪鐨勫悕縐版槸" + p.getPrinterName() + "銆?);
p.setPrinterName("Bob");
//涓嶄細鐢熸垚Printer
System.out.println("鐜板湪鐨勫悕縐版槸" + p.getPrinterName() + "銆?);
//涓嶄細鐢熸垚Printer
p.print("Hello, world.");
//鐢熸垚Printer
}
}
public class Singleton { 銆銆private Singleton(){} 銆銆//鍦ㄨ嚜宸卞唴閮ㄥ畾涔夎嚜宸變竴涓疄渚嬶紝鏄笉鏄緢濂囨紵 銆銆private static Singleton instance = new Singleton(); 銆銆//榪欓噷鎻愪緵浜嗕竴涓緵澶栭儴璁塊棶鏈琧lass鐨勯潤鎬佹柟娉曪紝鍙互鐩存帴璁塊棶銆銆
|
絎簩縐嶅艦寮?span>:
public class Singleton { 銆銆private static Singleton instance = null; }
|
浣跨敤Singleton.getInstance()鍙互璁塊棶鍗曟佺被銆?/span>
涓婇潰絎簩涓艦寮忔槸lazy initialization錛屼篃灝辨槸璇寸涓嬈¤皟鐢ㄦ椂鍒濆Singleton錛屼互鍚庡氨涓嶇敤鍐嶇敓鎴愪簡銆?/span>
娉ㄦ剰鍒?span>lazy initialization褰㈠紡涓殑synchronized錛岃繖涓猻ynchronized寰堥噸瑕侊紝濡傛灉娌℃湁synchronized錛岄偅涔堜嬌鐢╣etInstance()鏄湁鍙兘寰楀埌澶氫釜Singleton瀹炰緥銆?/span>
涓鑸涓虹涓縐嶅艦寮忚鏇村姞瀹夊叏浜涖?/p>
Builder妯″紡鏄竴姝ヤ竴姝ュ垱寤轟竴涓鏉傜殑瀵硅薄,瀹冨厑璁哥敤鎴峰彲浠ュ彧閫氳繃鎸囧畾澶嶆潅瀵硅薄鐨勭被鍨嬪拰鍐呭灝卞彲浠ユ瀯寤哄畠浠?鐢ㄦ埛涓嶇煡閬撳唴閮ㄧ殑鍏蜂綋鏋勫緩緇嗚妭.Builder妯″紡鏄潪甯哥被浼兼娊璞″伐鍘傛ā寮?緇嗗井鐨勫尯鍒ぇ姒傚彧鏈夊湪鍙嶅浣跨敤涓墠鑳戒綋浼氬埌.
鍥犱負涓涓鏉傜殑瀵硅薄,涓嶄絾鏈夊緢澶氬ぇ閲忕粍鎴愰儴鍒?濡傛苯杞?鏈夊緢澶氶儴浠?杞﹁疆 鏂瑰悜鐩?鍙戝姩鏈鴻繕鏈夊悇縐嶅皬闆朵歡絳夌瓑,閮ㄤ歡寰堝,浣嗚繙涓嶆榪欎簺,濡備綍灝嗚繖浜涢儴浠惰閰嶆垚涓杈嗘苯杞?榪欎釜瑁呴厤榪囩▼涔熷緢澶嶆潅(闇瑕佸緢濂界殑緇勮鎶鏈?,Builder妯″紡灝辨槸涓轟簡灝嗛儴浠跺拰緇勮榪囩▼鍒嗗紑.
棣栧厛,闇瑕佷竴涓帴鍙?瀹冨畾涔夊浣曞垱寤哄鏉傚璞$殑鍚勪釜閮ㄤ歡:
public interface Builder { 銆銆//鍒涘緩閮ㄤ歡A銆銆姣斿鍒涘緩姹借濺杞﹁疆 } |
鐢?span lang=EN-US>Director鏋勫緩鏈鍚庣殑澶嶆潅瀵硅薄,鑰屽湪涓婇潰Builder鎺ュ彛涓皝瑁呯殑鏄浣曞垱寤轟竴涓釜閮ㄤ歡(澶嶆潅瀵硅薄鏄敱榪欎簺閮ㄤ歡緇勬垚鐨?,涔熷氨鏄Director鐨勫唴瀹規槸濡備綍灝嗛儴浠舵渶鍚庣粍瑁呮垚鎴愬搧:
public class Director { 銆銆private Builder builder; 銆銆public Director( Builder builder ) { 銆銆} } |
Builder鐨勫叿浣撳疄鐜癈oncreteBuilder:
閫氳繃鍏蜂綋瀹屾垚鎺ュ彛Builder鏉ユ瀯寤烘垨瑁呴厤浜у搧鐨勯儴浠?
瀹氫箟騫舵槑紜畠鎵瑕佸垱寤虹殑鏄粈涔堝叿浣撲笢瑗?
鎻愪緵涓涓彲浠ラ噸鏂拌幏鍙栦駭鍝佺殑鎺ュ彛:
public class ConcreteBuilder implements Builder { 銆銆Part partA, partB, partC; } |
// 瀹炵幇浜х敓
Product p1 = manager.create("strong message");
p1.use("Hello, world.");
Product p2 = manager.create("warning box");
p2.use("Hello, world.");
Product p3 = manager.create("slash box");
p3.use("Hello, world.");
}
涔熷彲浠ュ皢product澹版槑鎴愭娊璞$被瀹炵幇Cloneable鎺ュ彛
騫朵笖瀹炵幇createClone鏂規硶
榪欐牱瀛愮被涓氨涓嶇敤鍐嶅0鏄巆reatClone鏂規硶浜?綆鍖栦簡浠g爜
clone鏂規硶鍦∣bject涓畾涔?鍥犳鎵鏈夌被閮戒細緇ф壙clone()鏂規硶
Cloneable榪欎釜鎺ュ彛琛ㄧず 鍙敤clone()鏂規硶榪涜澶嶅埗
clone()鏂規硶鍋氱殑鏄祬鎷瘋礉 鎵鍋氱殑鎿嶄綔鏄洿鎺ュ鍒跺瓧孌靛唴瀹?騫朵笉綆¤瀛楁瀵瑰簲鐨勫璞″疄渚嬪唴瀹?鍋囧畾鏈変竴涓暟緇?褰撲嬌鐢╟lone鏂規硶榪涜鎷瘋礉浠ュ悗 澶嶅埗鐨勭粨鏋滐紝鍙槸瀵瑰簲鍒拌鏁扮粍鐨勫弬鐓?鍗蟲寚鍚戣鏁扮粍鐨勫唴瀛樺湴鍧 濡傛灉鎯沖仛娣辨嫹璐?蹇呴』閲嶅啓clone鏂規硶 璁板緱瑕佸姞涓妔uper.clone()
public class Factory{
銆銆public static Sample creator(int which){
//getClass 浜х敓Sample 涓鑸彲浣跨敤鍔ㄦ佺被瑁呰澆瑁呭叆綾匯?br>銆銆if (which==1)
銆銆銆銆return new SampleA();
銆銆else if (which==2)
銆銆銆銆return new SampleB();
銆銆}
}
閭d箞鍦ㄤ綘鐨勭▼搴忎腑,濡傛灉瑕佸疄渚嬪寲Sample鏃?灝變嬌鐢?o:p>
Sample sampleA=Factory.creator(1);
榪欐牱,鍦ㄦ暣涓氨涓嶆秹鍙婂埌Sample鐨勫叿浣撳瓙綾?杈懼埌灝佽鏁堟灉,涔熷氨鍑忓皯閿欒淇敼鐨勬満浼?榪欎釜鍘熺悊鍙互鐢ㄥ緢閫氫織鐨勮瘽鏉ユ瘮鍠?灝辨槸鍏蜂綋浜嬫儏鍋氬緱瓚婂,瓚婂鏄撹寖閿欒
2銆丗actory Pattern鍦ㄧ埗綾昏瀹氬璞$殑鍒涘緩鏂規硶錛屼絾涓嶆繁鍏ュ埌鍏蜂綋鐨勭被鍚嶏紝鎵鏈夊叿浣撶殑瀹炵幇閮芥斁鍦ㄤ簡瀛愮被錛屽ぇ鑷村彲浠ュ垎涓轟駭鐢熷璞″疄渚嬬殑澶х翰(妗嗘灦)鍜屽疄闄呬駭鐢熷璞″疄渚嬬殑綾諱袱鏂歸潰
瀹炰緥錛?br>
framework涓殑Factory鏄疄鐜癱reat鐨勬娊璞$被
public final Product creat(String owner) {
Product p = creadProduct(owner);
registerProduct(p);
return p;
}
public abstract Product creadProduct(String owner);
famework涓殑Product鏄粎瀹炵幇use鏂規硶鐨勬娊璞$被
鍏蜂綋鐨勭敓鎴愬拰浣跨敤鏂規硶閮界敤idcard涓殑綾誨叿浣撳疄鐜?br> IDcardFactory錛?br> IDcardFactory extends Factory
public synchronized Product creadProduct(String owner) {
IDcard ic = new IDcard(owner);
return ic;
}
IDcarrd錛?br>class IDcard extends Product
IDcard(String owner) {
System.out.println("寤虹珛" + owner +"鐨勫崱");
this.owner = owner;
}
姝ゅ鏋勯犲嚱鏁頒笉鏄痯ublic 鍙湁閫氳繃鍚屼竴涓寘涓殑factory鎵嶅彲浠ヤ駭鐢熻繖涓璞″疄渚?/p>
public void use() {
System.out.println("浣跨敤" + owner + "鐨勫崱");
}
鍏蜂綋浣跨敤錛?br> public static void main(String[] args) {
Factory fc = new IDcardFactory();
Product p1 = fc.creat("card1");
Product p2 = fc.creat("card2");
Product p3 = fc.creat("card3");
p1.use();
p2.use();
p3.use();
}
榪欐牱涓嶅繀淇敼framework鍖呬腑鐨勫唴瀹瑰氨鑳藉鍒涘緩鍑轟笉鍚岀殑浜у搧鍜屽伐鍘?/p>