標籤:結構型 相關 class rri 提高 行為型 java bsp 根據
設計模式根據目的準則可以分為三類:
建立型:creational 建立型的設計模式與對象的建立有關。
結構型:Structural 處理類和對象之間的組合。
行為型:behavioral 描述類和對象如何互動及如何分配職責。
工廠方法模式
站在使用者的角度,Factory 方法模式是指使用者提出想要實現的具體功能或者說是想要生產的具體的東西的要求,在通過工廠製造之後就將該東西或功能交付給使用者。使用者並不知道實現的具體過程,只是做了要求提出以及實現的結果的使用。
嚴謹來說Factory 方法模式(Factory Method)也叫原廠模式,屬於類建立型模式,工廠父類(介面)負責定義產品對象的公用介面,而子類工廠則負責建立具體的產品對象。
目的:是為了把產品的執行個體化操作延遲到子類工廠中完成,通過工廠子類來決定究竟應該執行個體化哪一個產品具體對象
有四部分組成:
1. 抽象工廠角色:具體工廠必須實現的介面或必須繼承的父類。一般由抽象類別或介面實現。
2. 具體工廠角色:是具體應用程式調用以建立對應的具體產品的對象。一般它由具體的類來實現。
3. 抽象產品角色:具體產品繼承的父類或實現的介面。一般由抽象類別或介面實現。
4. 具體產品角色:具體工廠角色所建立的對象就是它的執行個體。一般由具體類實現。
通過執行個體來區分Factory 方法模式的四部分及運用。
執行個體:boss提出發送訊息給員工
public class FactoryMethod{
/**
* 定義公用的介面send
*/
interface Send {
void send();
}
/**
* 定義具體工廠角色,繼承公用介面
*/
class SmsFactory implements Send{
@Override
public void send() {
// TODO 自動產生的方法存根
System.out.println("通過簡訊發送訊息");
}
}
class MailFactory implements Send{
@Override
public void send() {
// TODO 自動產生的方法存根
System.out.println("通過E—mail發送訊息");
}
}
/**
* 將使用者所指定的方式與子工廠匹配,利用工廠實現
*
*/
class Factory{
public void method(String a){
if ("sms".equals(a)){new SmsFactory().send();}
else if("email".equals(a)){new MailFactory().send();}
else
System.out.print("輸入錯誤");
}
}
/**
* 定義使用者
*/
public static void main(String args[]){
FactoryMethod temp=new FactoryMethod();
Factory temp1=temp.new Factory();
temp1.method("sms");
temp1.method("email");
}
}
輸出為:通過簡訊發送訊息
通過E—mail發送訊息
抽象原廠模式
抽象原廠模式其實就是在Factory 方法模式的基礎上抽象出來了一部分。在Factory 方法模式中,發送訊息的兩種方式是在類Factory中進行匹配然後調用相關的具體工廠執行,假如此時需要增加另一種方式發送訊息,則需要將類Factory全部暴露給程式員,這種情況下是非常危險的。因此,應該將調用具體工廠的方式抽象出來,使得每一種工廠都有自己的調用方法,抽象出建立Create這個介面,每種調用方式均繼承這個介面,當需要增減發送方式的時候,只需要將這個介面拋出來,實現了低耦合,提高了安全性。
代碼如下:
package factory_method;
public class AbstractFactory{
/**
* 定義公用介面Send
*/
interface Send {
void send();
}
/**
* 定義具體工廠角色,繼承抽象工廠角色
*/
class SmsFactory implements Send{
@Override
public void send() {
// TODO 自動產生的方法存根
System.out.println("通過簡訊發送訊息");
}
}
class MailFactory implements Send{
@Override
public void send() {
// TODO 自動產生的方法存根
System.out.println("通過E—mail發送訊息");
}
}
/**
* 建立新的介面Create,調用具體工廠的每個方式都有其自己的類
*
*/
interface Create{
void method();
}
class SmsMethod implements Create{
@Override
public void method() {
// TODO 自動產生的方法存根
new SmsFactory().send();
}
}
class MailMethod implements Create{
@Override
public void method() {
// TODO 自動產生的方法存根
new MailFactory().send();
}
}
/**
* 定義使用者
*/
public static void main(String args[]){
AbstractFactory temp=new AbstractFactory();
temp.new SmsMethod().method();;
temp.new MailMethod().method();
}
}
總結
Factory 方法模式和抽象原廠模式都屬於原廠模式,最終目的都是為了降低耦合度,不必過於糾結是屬於哪種模式,在條件允許的情況下,能抽象出共同的介面就盡量抽象出來,能更方便的維護和擴充程式。
Java設計模式(建立型:Factory 方法模式+抽象原廠模式)