Java Design Patterns(2)

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 FactoryBuilderPrototypeFacade等。

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

时间: 2024-10-09 15:13:45

Java Design Patterns(2)的相关文章

详解User Defined Java Class步骤(二)

 详解User Defined Java Class步骤(二) kettle中的"user defined java class"步骤,也称UDJC步骤,从4.0版本就有,功能非常强大,无所不能:可以在其中写任意代码,却不影响效率.本文将详细介绍在不同场景中用示例展示如果使用该步骤,由于内容非常多,便于阅读方便,把内容分成三部分,请完整看完全部内容,示例代码在这里下载. 如果没有从第一部分开始,请访问第一部分. 使用步骤参数(Step Parameter) 如果你写了一段代码,如果

JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展

JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来聊聊final这个关键字 final可以修饰类,方法和变量 final修饰的类不可以被继承 final修饰的方法不可以被覆盖 final修饰的变量是一个常量,只能被赋值一次 内部类只能访问被final修饰的局部变量 final,故名思意,就是最终的意思,由以上的五种特性,不过final的出现,也是有

Java知多少(42)泛型通配符和类型参数的范围

本节先讲解如何限制类型参数的范围,再讲解通配符(?). 类型参数的范围 在泛型中,如果不对类型参数加以限制,它就可以接受任意的数据类型,只要它是被定义过的.但是,很多时候我们只需要一部分数据类型就够了,用户传递其他数据类型可能会引起错误.例如,编写一个泛型函数用于返回不同类型数组(Integer 数组.Double 数组等)中的最大值: 1 public <T> T getMax(T array[]){ 2 T max = null; 3 for(T element : array){ 4 m

深入理解Java:注解(Annotation)--注解处理器

深入理解Java:注解(Annotation)--注解处理器 如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器. 注解处理器类库(java.lang.reflect.AnnotatedElement): Java使用Annotation接口来代表程序元素前面的注解,该接口是所有Annotation类型的父接口.除此之外,Java在java.l

深入理解Java:注解(Annotation)自己定义注解入门

深入理解Java:注解(Annotation)自己定义注解入门 要深入学习注解.我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前.我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其它注解. Java5.0定义了4个标准的meta-annotation类型.它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email protected], [email protected], [email pro

《java小应用程序(Applet)和java应用程序(Application)分别编写的简单计算器》

Application和Java Applet的区别.Java语言是一种半编译半解释的语言.Java的用户程序分为两类:Java Application和Java Applet.这两类程序在组成结构和执行机制上都有一定的差异,主要体现在以下几方面:(1)运行方式不同.Java Application是完整的程序,可以独立运行:Java Applet程序不能单独运行, 它必须嵌入到用HTML语言编写的Web页面中,通过与Java兼容的浏览器来控制执行.(2)运行工具不同.Java Applicat

Java学习笔记(一)背景知识

1.Java属于编译型语言还是解释型语言? (1)Java即是编译型语言(把Java源代码编译成字节码,也就是*.class文件),又是解释型语言(由解释器解释字节码运行): (2)Java既不是纯粹的编译型语言(不生产特定平台的机器码),也不是纯粹的解释型语言(解释的不是源代码而是字节码) 2.如何理解Java虚拟机? (1)Java语言里负责解释执行字节码文件的是Java虚拟机(JVM Java Virtual Machine): (2)Java编译器负责生成虚拟机能理解的代码,然后由虚拟机

跟王老师学Java三大特性(一):案例 QuickHit:需求分析

项目案例:QuickHit:需求分析 主讲教师:王少华   QQ群号:483773664 学习目标 学会用面向对象思想来进行需求分析 一.需求 根据输入速率和正确率将玩家分为不同级别 级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高 规定时间内完成规定次数的输入,正确率达到规定要求,则升级 玩家最高级别为6级.初始级别一律为1级 用户错误输入一次,游戏结束 二.面向对象分析 (一) 发现类 玩家(Player)类 游戏(Game)类 级别(Level)类 (二)发现类的属性 1.玩家

Java深度历险(三)——Java线程?:基本概念、可见性与同步

开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的架构.对于Java来说,在语言内部提供了线程的支持.但是Java的多线程应用开发会遇到很多问题.首先是很难编写正确,其次是很难测试是否正确,最后是出现问题时很难调试.一个多线程应用可能运行了好几天都没问题,然后突然就出现了问题,之后却又无法再次重现出来.如果在正确性之外,还需要考虑应用的吞吐量和性能优化的话,就