日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

java工厂模式 uml_深入浅出设计模式-简单工厂模式

發(fā)布時間:2023/12/10 asp.net 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java工厂模式 uml_深入浅出设计模式-简单工厂模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

模式定義

簡單工廠模式是屬于創(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_深入浅出设计模式-简单工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。