1.工廠:寫一個介面,然後定義一些方法,最後由多個子類實作
2.產生工廠:寫一個抽象類別,使它可以產生1的產品,也是由子類別實作
使一個類別的實體化可以延遲到子類
※第二部分的產生工廠,如不寫抽象類別,然後將子類別的方法改成static,
因為變簡單了,所以就變成了簡單工廠模式,或者說靜態工廠模式
※1.工廠
public interface BreadFactory {
void getBread();
void getRaisin();
}
--------------------
public class FranceBread implements BreadFactory {
@Override
public void getBread() {
System.out.print("法國麵包");
}
@Override
public void getRaisin() {
System.out.println("不用葡萄乾");
}
}
--------------------
public class BoomBread implements BreadFactory {
@Override
public void getBread() {
System.out.print("炸彈麵包");
}
@Override
public void getRaisin() {
System.out.println("取得葡萄乾");
}
}
※
※2.產生工廠
public abstract class AbstractBreadFactory {
public abstract <T extends BreadFactory> T generateBread(Class<T> clazz);
}
--------------------
public class MadeBreadFactory extends AbstractBreadFactory {
@SuppressWarnings("unchecked")
@Override
public <T extends BreadFactory> T generateBread(Class<T> clazz) {
BreadFactory breadFactory = null;
try {
breadFactory = (T) Class.forName(clazz.getName()).newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
}
return (T) breadFactory;
}
}
※
※測試
AbstractBreadFactory factory = new MadeBreadFactory(); BreadFactory fb = factory.generateBread(FranceBread.class); fb.getBread(); fb.getRaisin(); BreadFactory bb = factory.generateBread(BoomBread.class); bb.getBread(); bb.getRaisin();
※結果:
法國麵包不用葡萄乾
炸彈麵包取得葡萄乾
※好處
只要知道類別名稱或字串(因Class.format也可接收包.類名的字串)即可,不用知道創建的過程,也就是低耦合擴展性也很好,如再增加一個鳳梨麵包,只要增加一個類別即可,其他都不用改
使用JDBC時只要將Class.forName的字串改掉即可切換就是一例,但SQL當然要用標準的才行
沒有留言:
張貼留言