1. 程式人生 > >java設計模型 解析工廠模式、proxy-agent模式、templete模式

java設計模型 解析工廠模式、proxy-agent模式、templete模式

復制代碼 nbsp 解析 try java.awt master 函數 form pre

1、Factory Design pattern

工廠設計模式的優點

(1)工廠設計模式提供了接口而不是實現的代碼方法。

(2)工廠模式從客戶端代碼中刪除實際實現類的實例化。工廠模式使我們的代碼更健壯,耦合更少,易於擴展。例如,我們可以輕松更改PC類實現,因為客戶端程序不知道這一點。

(3)工廠模式通過繼承提供實現和客戶端類之間的抽象。

JDK中工廠設計模式實列

java.util.Calendar,ResourceBundle和NumberFormat getInstance()方法使用Factory模式。

valueOf() 包裝類中的方法,如Boolean,Integer等。

代碼示例:https://github.com/journaldev/journaldev/tree/master/java-design-patterns/Factory-Design-Pattern

2、Prototype example

Employees.java

技術分享圖片
 1 package com.journaldev.design.prototype;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 public class Employees implements Cloneable{
 7 
 8     private List<String> empList;
 9     
10     public Employees(){
11         empList = new ArrayList<String>();
12     }
13     
14     public Employees(List<String> list){
15         this.empList=list;
16     }
17     public void loadData(){
18         //read all employees from database and put into the list
19         empList.add("Pankaj");
20         empList.add("Raj");
21         empList.add("David");
22         empList.add("Lisa");
23     }
24     
25     public List<String> getEmpList() {
26         return empList;
27     }
28 
29     @Override
30     public Object clone() throws CloneNotSupportedException{
31             List<String> temp = new ArrayList<String>();
32             for(String s : this.getEmpList()){
33                 temp.add(s);
34             }
35             return new Employees(temp);
36     }
37     
38 }
技術分享圖片

PrototypePatternTest.java

技術分享圖片
 1 package com.journaldev.design.test;
 2 
 3 import java.util.List;
 4 
 5 import com.journaldev.design.prototype.Employees;
 6 
 7 public class PrototypePatternTest {
 8 
 9     public static void main(String[] args) throws CloneNotSupportedException {
10         Employees emps = new Employees();
11         emps.loadData();
12         
13         //Use the clone method to get the Employee object
14         Employees empsNew = (Employees) emps.clone();
15         Employees empsNew1 = (Employees) emps.clone();
16         List<String> list = empsNew.getEmpList();
17         list.add("John");
18         List<String> list1 = empsNew1.getEmpList();
19         list1.remove("Pankaj");
20         
21         System.out.println("emps List: "+emps.getEmpList());
22         System.out.println("empsNew List: "+list);
23         System.out.println("empsNew1 List: "+list1);
24     }
25 
26 }
技術分享圖片

結果:

emps List: [Pankaj, Raj, David, Lisa]
empsNew List: [Pankaj, Raj, David, Lisa, John]
empsNew1 List: [Raj, David, Lisa]

3、Proxy模式

Proxy Design Pattern – Main Class

CommandExecutor.java

技術分享圖片
1 package com.journaldev.design.proxy;
2 
3 public interface CommandExecutor {
4 
5     public void runCommand(String cmd) throws Exception;
6 }
技術分享圖片

CommandExecutorImpl.java

技術分享圖片
 1 package com.journaldev.design.proxy;
 2 
 3 import java.io.IOException;
 4 
 5 public class CommandExecutorImpl implements CommandExecutor {
 6 
 7     @Override
 8     public void runCommand(String cmd) throws IOException {
 9                 //some heavy implementation
10         Runtime.getRuntime().exec(cmd);
11         System.out.println("‘" + cmd + "‘ command executed.");
12     }
13 
14 }
技術分享圖片

Proxy Design Pattern – Proxy Class

CommandExecutorProxy.java

技術分享圖片
 1 package com.journaldev.design.proxy;
 2 
 3 public class CommandExecutorProxy implements CommandExecutor {
 4 
 5     private boolean isAdmin;
 6     private CommandExecutor executor;
 7     
 8     public CommandExecutorProxy(String user, String pwd){
 9         if("Pankaj".equals(user) && "[email protected]$v".equals(pwd)) isAdmin=true;
10         executor = new CommandExecutorImpl();
11     }
12     
13     @Override
14     public void runCommand(String cmd) throws Exception {
15         if(isAdmin){
16             executor.runCommand(cmd);
17         }else{
18             if(cmd.trim().startsWith("rm")){
19                 throw new Exception("rm command is not allowed for non-admin users.");
20             }else{
21                 executor.runCommand(cmd);
22             }
23         }
24     }
25 
26 }
技術分享圖片

ProxyPatternTest.java

技術分享圖片
 1 package com.journaldev.design.test;
 2 
 3 import com.journaldev.design.proxy.CommandExecutor;
 4 import com.journaldev.design.proxy.CommandExecutorProxy;
 5 
 6 public class ProxyPatternTest {
 7 
 8     public static void main(String[] args){
 9         CommandExecutor executor = new CommandExecutorProxy("Pankaj", "wrong_pwd");
10         try {
11             executor.runCommand("ls -ltr");
12             executor.runCommand(" rm -rf abc.pdf");
13         } catch (Exception e) {
14             System.out.println("Exception Message::"+e.getMessage());
15         }
16         
17     }
18 
19 }
技術分享圖片

output

‘ls -ltr‘ command executed.
Exception Message::rm command is not allowed for non-admin users.

4、Singleton模式

(1)Singleton模式限制了類的實例化,並確保java虛擬機中只存在該類的一個實例。

(2)單例類必須提供一個全局訪問點來獲取類的實例。

(3)單例模式用於日誌記錄 ,驅動程序對象,緩存和線程池 。

(4)Singleton設計模式也用於其他設計模式,如Abstract Factory , Builder , Prototype , Facade等。

Singleton設計模式也用於核心java類,例如java.lang.Runtimejava.awt.Desktop

Java Singleton模式

為了實現Singleton模式,我們有不同的方法,但它們都有以下常見概念。

(1)私有構造函數,用於限制其他類的實例化。

(2)同一類的私有靜態變量,它是該類的唯一實例。

(3)返回類實例的公共靜態方法,這是外部世界獲取單例類實例的全局訪問點。

參考鏈接:https://www.journaldev.com/1827/java-design-patterns-example-tutorial

     https://www.cnblogs.com/yuanchao-blog/p/10779576.html

java設計模型 解析工廠模式、proxy-agent模式、templete模式