設計模式
工廠模式
public class Test {
public static void main(String[] args) {
Computer c1 =ComputerFactory.createComputerInstance();
c1.start();
Computer c2=ComputerFactory.createComputerInstance();
c2.start();
System.out.println(c1==c2); //false
}
}
class ComputerFactory {
public static Computer createComputerInstance() {
return new Computer(16,"華為","華碩");
}
}
class Computer{
public Computer(int memory, String disk, String mainboard){
this.memory = memory;
this.disk = disk;
this.mainboard = mainboard;
}
int memory;
String disk;
String mainboard;
void start() {
System.out.println("... 電腦自檢....");
System.out.println("記憶體:"+ memory );
System.out.println("硬碟:"+ disk );
System.out.println("主板:"+ mainboard );
System.out.println("電腦正常運行 ...");
}
}
特點:
1) 創建出來的物件,每次得到的都是一個新的實體
2) 把應用和物件的創建程序解耦合, 提升程式的可維護性和可擴展性
代理模式
ProxyFactory.java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//代理工廠,用來生成代理類物件
public class ProxyFactory implements InvocationHandler{
//委托物件
private Object targetObj;
//用這個方法創建代理物件
//this.targetObj.getClass() 得到目標物件的類裝載器
//this.targetObj.getClass().getInterfaces() 得到目標物件實作的介面
//this 是一個實作了InvocationHandler 的類物件
public Object createProxyInstance(Object targetObj) {
this.targetObj=targetObj;
return Proxy.newProxyInstance(this.targetObj.getClass().getClassLoader(), this.targetObj.getClass().getInterfaces(), this);
}
//proxy 代理物件
//method 代表攔到的方法
//args 代表攔到的方法的引數
//Object 型別的回傳值,代表攔到的方法的回傳值
public Object invoke(Object proxy,Method method, Object[] args) throws Throwable{
Object result = null;
String methodName = method.getName();
if(methodName.startsWith("play")) {
System.out.println("電影馬上開始了,爆米花、可樂、口香糖9.8折,快來買啊!");
method.invoke(targetObj, args);
System.out.println("電影馬上結束了,爆米花、可樂、口香糖9.8折,買回家吃吧!");
}
return result;
}
}
public interface Movie {
void play();
}
public class RealMovie implements Movie {
public void play() {
System.out.println("正在播放喜羊羊與灰太狼");
}
}
public static void main(String[] args) {
Movie movie = (Movie) new ProxyFactory().createProxyInstance(new RealMovie());
movie.play();
}
}
要注意,用這樣的方式創建代理物件,要求目標物件必須實作介面
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/500367.html
標籤:其他
