java工厂模式 uml_深入浅出设计模式-简单工厂模式
模式定義
簡單工廠模式是屬于創(chuàng)建型模式,又叫做靜態(tài)工廠方法(Static Factory Method)模式,但不屬于23種GOF設計模式之一。簡單工廠模式定義了一個創(chuàng)建對象的類,由這個類來封裝實例化對象的行為。
設計原則
遵循的原則:
依賴倒置原則
迪米特法則
里氏替換原則
接口隔離原則
未遵循的原則
開閉原則
單一職責原則
UML類圖
簡單工廠模式實例
問題描述
Pizza 類有很多子類,要求根據(jù)不同的情況用不同的子類實例化一個 Pizza 對象。
首先我們定義披薩接口
package com.wpx.simplefactory;
/**
* 定義披薩接口
*/
public interface Pizza {
public void make();
}
接著,定義兩個具體的披薩類,乳酪比薩和希臘披薩
package com.wpx.simplefactory;
/**
* 具體的披薩-乳酪比薩
*/
public class CheesePizza implements Pizza {
@Override
public void make() {
System.out.println("乳酪比薩");
}
}
package com.wpx.simplefactory;
/**
* 具體的披薩-希臘披薩
*/
public class GreekPizza implements Pizza {
@Override
public void make() {
System.out.println("希臘披薩");
}
}
緊接著,我們定義一個披薩工廠來生產(chǎn)披薩
package com.wpx.simplefactory;
/**
* 披薩工廠類
*/
public class SimplePizzaFactory {
public static Pizza createPizza(String type) {
if (type.equals("乳酪比薩")) {
return new CheesePizza();
} else if (type.equals("希臘披薩")) {
return new GreekPizza();
} else {
throw new UnsupportedOperationException();
}
}
}
現(xiàn)在一個基于簡單工廠模式的披薩工廠就建造完成了,我們對此進行測試,讓披薩工廠來一份乳酪披薩嘗嘗。
package com.wpx.simplefactory;
/**
* 測試簡單工廠模式-披薩工廠
*/
public class PizzaStore {
public static void main(String[] args) {
Pizza pizza = SimplePizzaFactory.createPizza("乳酪比薩");
pizza.make();
}
}
運行結果
乳酪比薩
Process finished with exit code 0
java.text.DateFormat中的簡單工廠模式
DateFormat:jdk中的一個工具類java.text.DateFormat,用來格式化一個本地日期與時間
通過源碼我們可以知道DateFormat是一個抽象類(abstract),下面的源代碼就是這個類里包含的方法,其實這些就是靜態(tài)工廠方法,通過靜態(tài)方法來提供自己的實例是完全可以的(抽象類本身不能進行實例化)。從源碼可以看出getDateInstance()方法做了兩件事情:
運用了多態(tài)性:由于SimpleDateFormat是DateFormat的子類,而getDateInstance()聲明的類型為DateFormat而實際返回類型為子類SimpleDateFormat
使用了靜態(tài)工廠方法(static):由于DateFormat是抽象類不能進行實例化,因此也就不能調用其中的普通方法(非靜態(tài)方法)。因此我們必須將其聲明為static,才能返回實例
通過上面做的兩件事情就將具體子類的實例化過程隱藏起來了,調用者不必考慮具體子類的實例化,因為抽象類會提供它的合適子類實例
public final static DateFormat getDateInstance()
{
return get(0, DEFAULT, 2, Locale.getDefault());
}
public final static DateFormat getDateInstance(int style)
{
return get(0, style, 2, Locale.getDefault());
}
public final static DateFormat getDateInstance(int style,
Locale aLocale)
{
return get(0, style, 2, aLocale);
}
private static DateFormat get(int timeStyle, int dateStyle,
int flags, Locale loc) {
if ((flags & 1) != 0) {
if (timeStyle < 0 || timeStyle > 3) {
throw new IllegalArgumentException("Illegal time style " + timeStyle);
}
} else {
timeStyle = -1;
}
if ((flags & 2) != 0) {
if (dateStyle < 0 || dateStyle > 3) {
throw new IllegalArgumentException("Illegal date style " + dateStyle);
}
} else {
dateStyle = -1;
}
try {
// Check whether a provider can provide an implementation that's closer
// to the requested locale than what the Java runtime itself can provide.
LocaleServiceProviderPool pool =
LocaleServiceProviderPool.getPool(DateFormatProvider.class);
if (pool.hasProviders()) {
DateFormat providersInstance = pool.getLocalizedObject(
DateFormatGetter.INSTANCE,
loc,
timeStyle,
dateStyle,
flags);
if (providersInstance != null) {
return providersInstance;
}
}
return new SimpleDateFormat(timeStyle, dateStyle, loc);
} catch (MissingResourceException e) {
return new SimpleDateFormat("M/d/yy h:mm a");
}
}
總結
優(yōu)點:
將創(chuàng)建實例的工作與使用實例的工作分開,使用者不必關心類對象如何創(chuàng)建,明確了職責。
把初始化實例時的工作放到工廠里進行,使代碼更容易維護。更符合面向對象的原則,面向接口編程,而不是面向實現(xiàn)編程。
缺點:
由于工廠類集中了所有產(chǎn)品創(chuàng)建邏輯,一旦不能正常工作,整個系統(tǒng)都要受到影響。
要新增產(chǎn)品類的時候,就要修改工廠類的代碼,違反了開放封閉原則(對擴展的開放,對修改的關閉)。
簡單工廠模式由于使用了靜態(tài)工廠方法,造成工廠角色無法形成基于繼承的等級結構。
總結
以上是生活随笔為你收集整理的java工厂模式 uml_深入浅出设计模式-简单工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hpzstatn.exe是什么进程 有什
- 下一篇: asp.net ajax控件工具集 Au