工廠模式
工廠方法模式又叫虛擬構造函數模式或者多態性工廠模式。工廠方法的用意是定義一個創建產品對象的工廠接口,將實際創見性工作推遲到子類中去。工廠模式可以分爲簡單工廠、工廠方法和抽象工廠模式。
簡單工廠模式
嚴格說簡單工廠模式不在23種GoF設計模式之中,它是由工廠決定創建具體類的實例。一個工廠類處於對產品類實例化的中心位置,它知道每一個產品,決定哪一個產品類應當被實例化。
優點:允許客戶端(具體產品類)相對獨立於產品實例的創建過程,當引入新的產品的時候,不需要修改現有的產品類。
缺點:由於對象的創建完全由工廠類控制,引入新的產品的時候就必須修改工廠類的相應的邏輯。
簡單工廠模式的UML圖如下:
邏輯涉及到的對象有以下3種:
工廠角色(Cerator):簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。
抽象產品角色(IProduct):簡單工廠模式所創建的所有對象的父類,所有實例所共有的公共接口。
具體產品角色(ConcreteProduct):簡單工廠模式的創建的實際目標。
下面是一個應用了簡單工廠模式的,生產手機和電腦的電子工廠例子。
抽象產品接口:
public interface Iproduct {
public void doSomething() ;
}
具體產品角色:手機phone
public class Phone implements Iproduct{
@Override
public void doSomething() {
System.out.println("手機:打電話");
}
}
具體產品角色:電腦computer
public class Computer implements Iproduct{
@Override
public void doSomething() {
System.out.println("電腦:上網");
}
}
工廠角色:Creator
public class Creator {
public static Iproduct getProduct(String productName) throws Exception{
Iproduct product = null;
if(productName.equals("computer")) product = new Computer();
else if(productName.equals("phone")) product = new Phone();
else {
throw new Exception("工廠無法生產該產品!");
}
return product;
}
}
測試類:
public class Test {
public static void main(String[] args) throws Exception{
//獲取手機phone的實例
Phone phone = (Phone)Creator.getProduct("phone");
phone.doSomething();
//獲取電腦的實例
Computer computer = (Computer)Creator.getProduct("computer");
computer.doSomething();
}
}