單態模式
public class Singleton { private Singleton(){} //在自己內部定義自己一個執行個體,是不是很奇怪。 //注意這是private 只供內部調用 private static Singleton instance = new Singleton(); //這裡提供了一個供外部存取本class的靜態方法,可以直接存取 public static Singleton getInstance() { return instance; } }
原廠模式
package com; //產品介面 interface Product { public void getName(); } // 具體產品A class ProductA implements Product { public void getName() { System.out.println(" I am ProductA "); } } // 具體產品B class ProductB implements Product { public void getName() { System.out.println(" I am ProductB "); } } // 工廠類 public class ProductCreator { public Product createProduct(String type) { if (" A ".equals(type)) { return new ProductA(); } if (" B ".equals(type)) { return new ProductB(); } else return null; } public static void main(String[] args) { ProductCreator creator = new ProductCreator(); creator.createProduct(" A ").getName(); creator.createProduct(" B ").getName(); } }
代理模式1
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyTest { public static void main(String[] args) { SaleComputer saleComputer = new ComputerMaker(); InvocationHandler handler = new SaleProxy(saleComputer); SaleComputer proxy = (SaleComputer)Proxy.newProxyInstance(saleComputer.getClass().getClassLoader(), saleComputer.getClass().getInterfaces(), handler); proxy.saleComputer("花花"); } } interface SaleComputer{ //賣電腦 public void saleComputer(String type); } class ComputerMaker implements SaleComputer{ public void saleComputer(String type) { System.out.println("賣出一台 " + type +" 牌電腦。"); } } class SaleProxy implements InvocationHandler{ Object delegate; public SaleProxy(Object delegate) { this.delegate = delegate; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { giveMouse(); return method.invoke(delegate,args); } private void giveMouse(){ System.out.println("送滑鼠..............."); } }
代理模式2
public class ProxyTest1 { public static void main(String[] args) { SaleComputer1 saleComputer = new ComputerMaker1(); SaleComputer1 proxy = new SaleProxy1(saleComputer); proxy.saleComputer("鴻潤"); } } interface SaleComputer1{ //介面 public void saleComputer(String type); } class ComputerMaker1 implements SaleComputer1{//實作類別 public void saleComputer(String type) { System.out.println("賣出一台 " + type +" 牌電腦。"); } } class SaleProxy1 implements SaleComputer1{ //代理類 SaleComputer1 delegate; public SaleProxy1(Object delegate){ this.delegate = (SaleComputer1)delegate; } public void saleComputer(String type) { this.giveMouse(); delegate.saleComputer(type); } private void giveMouse(){ System.out.println("送滑鼠..............."); } }
觀察者模式:
package com.model; import java.util.Observable; import java.util.Observer; /** Java的API為我們提供了Observer介面和Observable類來實現所謂觀察者模式。 Observable(可觀察者)類允許在自身發生改變時,通知其它對象(實現介面Observer,觀察者)。 */ public class TestObserver{ public static void main(String[] args){ Produce produce = new Produce(); NameObserver nameObserver = new NameObserver(); PriceObserver priceObserver = new PriceObserver(); produce.addObserver(nameObserver); produce.addObserver(priceObserver); produce.setName("Apple"); produce.setPrice(100); } } //一個可觀察者 class Produce extends Observable{ private String name; private Integer price; public String getName() { return name; } public void setName(String name) { this.name = name; setChanged(); //設定變化點 notifyObservers(name); //通知觀察者 } public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; setChanged(); notifyObservers(price); } } //兩個觀察者 class NameObserver implements Observer{ public void update(Observable o, Object arg) { if(arg instanceof String){ System.out.println("觀察者觀察到:產品名字已經改為: " + arg); } } } class PriceObserver implements Observer{ public void update(Observable o, Object arg) { if(arg instanceof Integer){ System.out.println("觀察者觀察到:價格已經改為: " + arg); } } }