1. 程式人生 > >(java)工廠模式和策略模式

(java)工廠模式和策略模式

工廠模式

工廠模式是我們最常用的例項化物件模式了,是用工廠方法代替new操作的一種模式。工廠模式在Java程式系統可以說是隨處可見。因為工廠模式就相當於建立例項物件的new,我們經常要根據類Class生成例項物件,如A a=new A() 工廠模式也是用來建立例項物件的,所以以後new時就要多個心眼,是否可以考慮使用工廠模式,雖然這樣做,可能多做一些工作,但會給你係統帶來更大的可擴充套件性和儘量少的修改量。

為了解耦還有後面的修改程式碼的過程中減少錯誤,所以用工廠來完成操作.

例子

我們平常都知道計算器吧,以計算器的加減乘除 來說明.

首先 我們定義一個抽象的操作類

裡面定義了兩個輸入數 A B  定義了一個抽象的getResult() 方法  顧名思義 就是得到計算結果 給下層繼承的類進行定製
public
abstract class Operation { private double numberA; private double numberB; public abstract double getResult(); //忽略set get }

再定義加減乘除類 這些類都繼承Operation抽象類

//加法操作類
public class OperatorAdd extends Operation{
	@Override
	public double getResult() {
		double result = this.getNumberA() + this.getNumberB();
		return
result; } } //減法操作類 public class OperatorSub extends Operation{ @Override public double getResult() { double result = this.getNumberA() - this.getNumberB(); return result; } } //乘法操作類 public class OperatorMul extends Operation{ @Override public double getResult() { double result = this.getNumberA() * this.getNumberB(); return
result; } } //除法操作類 public class OperatorDiv extends Operation { @Override public double getResult(){ if (this.getNumberB() == 0){ try { throw new Exception("除數為0"); } catch (Exception e) { e.printStackTrace(); } } double result = this.getNumberA() / this.getNumberB(); return result; } }

好了 加減乘除的功能都寫好 下面我們寫一個計算的工廠類,要求的目標就是 傳入一個運算子號 就返回所需要的計算類

public static Operation createOperate(String operate) {
		Operation oper = null;
		switch (operate) {
		case "+":
			oper = new OperatorAdd();
			break;
		case "-":
			oper = new OperatorSub();
			break;
		case "*":
			oper = new OperatorMul();
			break;
		case "/":
			oper = new OperatorDiv();
			break;
		}
		return oper;
}

用法:

Operation oper = OperationFactory.createOperate("+");
oper.setNumberA(1);
oper.setNumberB(2);
System.out.println(oper.getResult());

上述的就是我們所說的簡單工廠的基礎封裝,簡而言之 就是需要什麼型別我們不需要再自己new xxxx() ,要什麼 就從工廠裡拿.

而對於的抽象工廠,可能會用的少一點,有興趣可以自己網上看看.. 提供一個例子:

interface IProduct1 {  
    public void show();  
}  
interface IProduct2 {  
    public void show();  
}  
  
class Product1 implements IProduct1 {  
    public void show() {  
        System.out.println("這是1型產品");  
    }  
}  
class Product2 implements IProduct2 {  
    public void show() {  
        System.out.println("這是2型產品");  
    }  
}  
  
interface IFactory {  
    public IProduct1 createProduct1();  
    public IProduct2 createProduct2();  
}  
class Factory implements IFactory{  
    public IProduct1 createProduct1() {  
        return new Product1();  
    }  
    public IProduct2 createProduct2() {  
        return new Product2();  
    }  
}  
  
public class Client {  
    public static void main(String[] args){  
        IFactory factory = new Factory();  
        factory.createProduct1().show();  
        factory.createProduct2().show();  
    }  
}

策略模式

定義了一系列的演算法,並將每一個演算法封裝起來,而且使它們可以相互替換。策略模式讓演算法獨立於使用它的客戶而獨立變化.

首先 定義一個抽象的策略類

public abstract class Strategy {

	public abstract void algorithmIterface();//演算法方法
}

再來定義一個環境類(Context)

public class Context {

	private Strategy strategy;
	public Context(Strategy strategy){
		this.strategy = strategy;
	}
	
	//上下文介面
	public void ContextInterface(){
		strategy.algorithmIterface();
	}
}

既然有了抽象的策略類,下面我們就可以繼承並重寫algorithmIterface()方法

public class ConcreteStrategyA extends Strategy {

	@Override
	public void AlgorithmIterface() {
		System.out.println("演算法A");
	}

}
public class ConcreteStrategyB extends Strategy {
	@Override
	public void AlgorithmIterface() {
		System.out.println("演算法B實現");
		
	}
}

用法:

public static void main(String[] args) {
		Context context = new Context(new ConcreteStrategyA());
		context.ContextInterface();
}

適用的地方

當存在以下情況時使用Strategy模式

1)許多相關的類僅僅是行為有異。 “策略”提供了一種用多個行為中的一個行為來配置一個類的方法。即一個系統需要動態地在幾種演算法中選擇一種。

2)需要使用一個演算法的不同變體。例如,你可能會定義一些反映不同的空間 時間權衡的演算法。當這些變體實現為一個演算法的類層次時 ,可以使用策略模式。

3)演算法使用客戶不應該知道的資料。可使用策略模式以避免暴露覆雜的、與演算法相關的資料結構。

4) 一個類定義了多種行為 , 並且這些行為在這個類的操作中以多個條件語句的形式出現。將相關的條件分支移入它們各自的Strategy類中以代替這些條件語句。

總結

簡單工廠模式也可以和策略模式結合起來用,有興趣可以看看

總之,如果別人能快速理解你的程式碼,就是好程式碼。程式碼的可讀性不是非得使用設計模式。

參考:

  • 《大話設計模式》

相關推薦

(java)工廠模式策略模式

工廠模式 工廠模式是我們最常用的例項化物件模式了,是用工廠方法代替new操作的一種模式。工廠模式在Java程式系統可以說是隨處可見。因為工廠模式就相當於建立例項物件的new,我們經常要根據類Class生成例項物件,如A a=new A() 工廠模式也是用來建立例項物件的

簡單工廠模式策略模式的區別

首先看一下簡單工廠類和策略模式(Context)類中程式碼的區別: 簡單工廠類: //現金收費工廠類 class CashFactory { public static CashSuper createCashAccept(string type) { Cas

【設計模式】(一)-簡單工廠模式策略模式

前言 最近開始和春哥,張鐸 ,銀平討論設計模式,成立了一個小菜變大鳥的小組,每天討論一個模式,並且把這個模式搞懂,每學一個新的模式,再回顧一下之前學的模式。這兩天學了簡單工廠模式和策略模式,發現兩個模式有很多相同之處,下面用商場促銷的例子來對兩個模式總結一下。 簡單工廠模式 1.

大話設計模式中簡單工廠模式策略模式的商場收銀軟體例項的C++程式碼

策略模式是一種定義一系統演算法的方法,從概念上來看,所有這些演算法完成的都是相同的工作,只是具體的實現不同;策略模式可以以相同的方式呼叫所有的演算法,減少了各種演算法類與使用演算法類之間的耦合。 策略模式是用來封裝演算法的,但在實踐中,我們發現可以用它來封裝幾乎任何型別的規

使用工廠模式策略模式重構複雜業務邏輯

專案組在和外部系統對接,花了好長一段時間對以前的列印邏輯做修改,修改了8次的bug,才實現了當前的外接系統的列印功能,上線的前一刻又發現此次的改動對以前的邏輯產生關聯影響,哎,不談了,原因很簡單,隨著外接系統的增多,實現的列印方式和功能已經很多了,而此時幾千行的程式碼看看已

三種工廠模式 策略模式 對比

一、引子 話說十年前,有一個爆發戶,他家有三輛汽車(Benz(賓士)、Bmw(寶馬)、Audi(奧迪)),還僱了司機為他開車。不過,爆發戶坐車時總是這樣:上Benz車後跟司機說“開賓士車!”,坐上Bmw後他說“開寶馬車!”,坐上 Audi後他說“開奧迪車!”。

Java中,狀態模式策略模式的區別

Java開發者,要想恰當的使用狀態模式和策略模式,必須清楚的理解它們之間的區別。雖然狀態模式和策略模式擁有相似的結構,雖然它們都基於SOLID設計原則中的O(開閉原則),但是,它們的意圖是完全不同的。 策略模式通過封裝一組相關演算法,為Client提供執行時的靈活性。Cl

工廠模式策略模式

一、工廠模式1.1簡單工廠模式實現計算器一般實現的計算器需要在客戶端進行邏輯判斷,在新增新的功能的時候需要修改很多的程式碼,而用簡單工廠模式可以將邏輯判斷的程式碼放在後臺,而且在新增新的功能的時候也很容易。在不用的應用中也能複用。首先建立Operation抽象類,將公有的方法

《設計模式之禪》學習小結之責任鏈模式,裝飾模式策略模式

一。責任鏈模式 責任鏈模式將多個處理物件聚合成一條鏈狀,被處理物件直接交由鏈頭處理,它會在鏈中被依次傳遞下去直到處理完成或到達最後一個處理物件為止。責任鏈模式可以將請求和處理分開,但是要注意鏈過長時的效能問題和鏈中節點數量問題。 二。裝飾模式 裝飾模式模式可以說是代理

橋接模式策略模式的區別

  學習的過程中發現這兩個概念真的是有點區分不開,儘管可以很感性的說bridge模式要比strategy模式更復雜更具可塑性,更“高階”,但是如何清晰闡述兩者區別,卻實是有點困難。 套用偉人的一句話,站在巨人的肩膀上看得更遠,下邊三段分別來自CSDN論壇的貼子

代理模式 策略模式 看似相似,有什麼不同

代理模式在使用的時候,使用的物件我們並不關係被代理者。 策略模式在使用的時候,我們使用的時候其實我們是知道指定的執行者。 如下 (注意傳參) 代理模式 Assist assist = new A

模板方法模式策略模式的相似點差異性

Template 模式採用繼承的方式實現演算法的異構,其關鍵點就是講通過演算法封裝在抽象基類中,並將不同的演算法實現細節放在子類中實現。Template模式符合面向物件系統分析和設計中的一個原則,依賴倒置原則,父類呼叫子類的操作,底層模組實現高層模組宣告的介面。這樣控制權在

java設計模式策略模式簡單工廠模式

簡單工廠模式:將物件交由工廠來生成。 策略模式: 主要與演算法有關。 定義了演算法家族,分別封裝起來,讓它們直接可以相互替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。 與簡單工廠模式相結合

Java設計模式思想(單列模式工廠模式策略模式,共23種設計模式

a) 單例模式:單例模式核心只需要new一個例項物件的模式,    比如資料庫連線,線上人數等,一些網站上看到的線上人數統計就是通過單例模式實現的,    把一個計時器存放在資料庫或者記憶體中,當有人登陸的時候取出來加一再放回去,    有人退出登陸的時候取出來減一再放回去,

設計模式策略模式&簡單工廠模式

抽象 jsb args watermark amp pri eas 時間 並且 學習設計模式已經有非常長一段時間了。事實上先前已經敲過一遍了,可是老認為沒有學到什麽,認識也不夠深刻,如今趁著重構機房。再又一次來過,也不晚。 事實上在敲了機房之後,看看模式,事實

activeMQ隊列模式主題模式Java實現

ons javax try nfa port 實現 catch n) tac 一、隊列模式 生產者 import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Dest

java設計模式策略模式總結

客戶端 出場 cnblogs ava java設計 bsp image 需要 com 策略模式的定義:(定義截自http://www.cnblogs.com/whgk/p/6087064.html) 1、策略模式定義了算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓算

二、使用簡單工廠來改進策略模式

麻煩 str 不同 [] ring www ride say 模式 策略模式的使用,把一系列算法進行了封裝,只需要通過配置不同的算法,即可以實現算法的自由切換。具體內容參考第一篇:http://www.cnblogs.com/lay2017/p/7570041.html 但

Java設計模式策略模式

pattern 管理 父類 interface face 缺點 this err 相互 策略模式屬於對象的行為模式,策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換,策略模式讓算法獨立於使用它的客戶而獨立變化。策略模式使這些算法在客

使用Java編寫ActiveMQ的隊列模式主題模式

ActiveMQ 消息中間件 分布式 主題模式 隊列模式 隊列模式的消息演示 本小節簡單演示一下如何使用JMS接口規範連接ActiveMQ,首先創建一個Maven工程,在pom.xml文件中,添加activemq的依賴: <dependencies> <depen