文档章节

设计模式基础

mysky221
 mysky221
发布于 2014/01/30 23:53
字数 1708
阅读 47
收藏 0
点赞 0
评论 0

1.   简单工厂模式

(说明:本内容由网上视频教程整理,主要是方便自用,仅作参考。如果有错欢迎指出!)  

简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。







 

2.   工厂方法模式

简介:

和简单工厂模式差不多,都是“工厂模式”。

工厂方法模式同样属于类的创建型模式又被称为多态工厂模式工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

 

“开放和封闭原则”

开放:系统无限扩展;

封闭:不要修改既有代码。

 

简单工厂模式破坏了“开放和封闭原则”,比如,如果FruitFactory类是这样写:

public class FruitFactory {
    // 简单工厂,获取类实例的方法二:
// 这个方法的好处是参数名可以不分大小写(而且获取参数可以随便处理)
    // 缺点是增加水果的时候要增加if...else...不易扩展。
    public static FruitInter getFruit2(String type){
      
       if(type.equalsIgnoreCase("apple")){
           return new Apple();
//return Apple.class.newInstance()
       }else if(type.equalsIgnoreCase("banana")){
           return new Banana();
//return Banana.class.newInstance();
       }else{
           System.out.println("no such class!");
           return null; 
       }
}

 

那么,如果增加一个水果类(如Pear.java)的话,就需要增加一个else…的分支语句来处理,这就破坏了“开放和封闭原则”。

 

使用工厂方法模式:创建一个抽象工厂(或者说接口)FruitFactory.java,内部声明一个方法getFruit()方法;然后为每个水果类分别创建自己的工厂类,如AppleFactory.java,并实现FruitFactory接口,在实现的getFruit()方法中完成类的实例操作。

 

【具体做法:】

首先Apple.javaBanana.javaFruit.java三个类都和简单工厂类相同:

public interface Fruit {
    public void get();
}
 
public class Apple implements Fruit {
    public void get(){
       System.out.println("Collect apple.");
    }
}
 
public class Banana implements Fruit{
    public void get() {
       System.out.println("Collect banana.");
    }
}

 

其次,增加抽象工厂类(接口):

public interface FruitFactory {
    public Fruit getFruit();
}

 

然后,为Apple.javaBanana.jav a提供工厂类:

public class AppleFactory implements FruitFactory {
 
    public Fruit getFruit() {
       return new Apple();
    }
}
 
public class BananaFactory implements FruitFactory {
    public Fruit getFruit() {
       return new Banana();
    }
}

 

main方法中这么写:

public class MainClass {
    public static void main(String[] args) {
       // Apple
       FruitFactory fruitFactory1 = new AppleFactory();
       Fruit apple = fruitFactory1.getFruit();
       apple.get();
       // Banana
       FruitFactory fruitFactory2 = new BananaFactory();
       Fruit banana = fruitFactory2.getFruit();
       banana.get();
    }
}


3.   抽象工厂模式








4.   工厂模式在开发中的应用(计算器程序)

实现加减法!


**一般的思维

一般的思维是,直接在main方法中实现所有的业务,如下所示:


public class Main {

	public static void main(String[]args){
		
		System.out.println("---Caculation Program---");
		
		System.out.print("Input the first num: ");
		Scanner scanner = new Scanner(System.in);
		String num1 = scanner.nextLine();
		System.out.print("Input the operation: ");
		String oper = scanner.nextLine();
		System.out.println("Input the second num: ");
		String num2 = scanner.nextLine();
		
		double num1d = Double.parseDouble(num1);
		double num2d = Double.parseDouble(num2);
		double result = 0;
		
		if(oper.equals("+")){
			result = num1d + num2d;
		}else if(oper.equals("-")){
			result = num1d - num2d;
		}else{
			System.out.println("ERROR!");
			System.exit(0);
		}
		
		System.out.println("Result is: "+result);
		
	}
	
}

这样的代码冗余、可扩展性不好!
下面使用工厂模式实现。

**简单工厂模式实现

即使用专用的类(工厂类)来获取操作类(Operation类,用来实现各自的不同的四则运算



**工厂方法模式实现:

增加抽象工厂(接口):


5.   单例模式



(1)定义:

 

单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。

其实,GoF对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。

(2)为什么要有单例模式:

在应用系统开发中,我们常常有以下需求:

l  在多个线程之间,比如servlet环境,共享同一个资源或者操作同一个对象;

l  在整个程序空间使用全局变量,共享资源;

l  大规模系统中,为了性能的考虑,需要节省对象的创建时间等等。

 

因为Singleton模式可以保证为一个类只生成唯一的实例对象,所以这些情况,Singleton模式就派上用场了。

(3)单例模式的实现:

 饿汉式



像上面定义的类,外面的获取到的Person对象只会有一个。

懒汉式


 双重检查

在懒汉式中,我们将Synchronized加在了整个方法前,所以一个线程会守住整个方法,这样就影响了效率,我们是希望person只被实例化一次,可以将Synchronized加在实例化前:

这里还有个问题,就是当两个线程同时进入if的话,那么还会创建两个对象,下面加上两重循环:

    以上就是“双重检查”!

双重检查比懒汉式的效率更高:因为如果有多个线程同时执行的时候,不会让其他线程等待(仅第一次执行的时候可能会等待,以后都不会等待)!

对于饿汉式,饿汉式优点是简单且线程永远安全,但是比较耗费资源,因为只要类被加载就对象就被创建。

6.   原型模式

(1)定义:

Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用Prototype模式创建的实例,具有与原型一样的数据。

 

(2)原理:

1)  由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身;

2)  目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值;

3)  根据对象克隆深度层次的不同,有浅度克隆深度克隆

4)  要想类能够被克隆,就必须让类实现Cloneable接口(其实仅仅是做一个声明而已!)。

 


假如,Person类里有属性:List<String>friends,即:

因为person1的属性friends持有的是另外一个对象的引用,所以在main方法中克隆的时候,(在栈中)person2克隆的也是一个引用,且指向同一个对象:

这就是“浅拷贝”,要想friends指向的也是全新的对象,那么就要手动添加(即“深拷贝”):

main方法:


© 著作权归作者所有

共有 人打赏支持
mysky221
粉丝 2
博文 63
码字总数 126638
作品 0
南京
设计模式之禅(第2版).epub

【下载地址】 本书是设计模式领域公认的3本经典著作之一,“极具趣味,容易理解,但讲解又极为严谨和透彻”是本书的写作风格和方法的最大特点。第1版2010年出版,畅销至今,广受好评,是该领...

winter730
05/16
0
0
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
0
0
炒冷饭系列:设计模式 抽象工厂模式

炒冷饭系列:设计模式 抽象工厂模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难;亲恶我,孝方贤。 一、什么是抽象工厂模...

泥沙砖瓦浆木匠
2014/07/24
0
0
javascript 设计模式之工厂(Factory)模式

工厂模式介绍 工厂模式是一个创建型的模式,主要就是创建对象。其中工厂模式又分为简单工厂模式和抽象工厂模式。简单工厂模式是通过工厂方法确定创建 对应类型的对象。抽象工厂模式是通过子类...

hlxiong
2014/04/14
0
0
Tomcat 系统架构与设计模式_ 设计模式分析

门面设计模式 门面设计模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中、Standard Wrapper 到 ServletConfig 封装中、ApplicationContext 到 ServletContext 封装中等都用到...

lvzjane
2014/11/03
0
0
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
05/08
0
0
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho
04/09
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
06/24
0
0
groovy 闭包【命令模式】

在Java编程世界,有两个设计模式又简单、又常用,而且实现方式也很相似,这就是命令模式和策略模式。 有关这两个模式的讲解,在网络上真是汗牛充栋,大家可以随便搜索一下,就是一大堆。 可以...

k_k_anna
2015/01/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

TensorFlow 线性回归 拟合

用tf 对 一次函数进行拟合 效果 loss 简单实现如下 import tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt# 保存显示数据plotdata = {"batchsize": [], "los...

阿豪boy
11分钟前
0
0
JupyterLab安装地图插件

JupyterLab安装地图插件 (本文所述软件还在发展之中,欢迎加入开源项目,提供建议、测试和开发。) 在Jupyter中进行数据分析时,往往需要将数据叠加到地图上。简单的可以利用matplotlib/ec...

openthings
19分钟前
0
0
Coding and Paper Letter(八)

资源整理 1 Coding: 1.Python项目,由Allen Downey撰写的Think Python第二版的LaTeX源代码和支持代码。 ThinkPython2 2.R语言包h3jsr,h3jsr使用V8的神奇力量通过其javascript绑定提供对Ube...

胖胖雕
28分钟前
0
0
skiplist跳跃表

插入删除log(N) TODO

梦想游戏人
29分钟前
1
0
利用世界杯,读懂 Python 装饰器

Python 装饰器是在面试过程高频被问到的问题,装饰器也是一个非常好用的特性, 熟练掌握装饰器会让你的编程思路更加宽广,程序也更加 pythonic。 今天就结合最近的世界杯带大家理解下装饰器。...

p柯西
43分钟前
0
0
Xshell登录阿里云服务器ECS

Xshell登录阿里云服务器ECS 1. 参考资料: 1). 《阿里云服务器怎么用?阿里云服务器使用教程》 链接:http://www.cr173.com/html/50758_1.html 2). eagle-zhang的CSDN博客《Xshell连接不上阿...

SuShine
52分钟前
1
0
IDEA中的HTTP Client Editor测试API

在前后端分离项目,前后端通过api进行通信。如果用postman免费版进行api测试的话,由于无法保存测试脚本到文件,不方便前端查看。 你可以选择付费版。也可以利用IDEA自带的HTTP Client Edito...

hutaishi
55分钟前
0
0
解决“只能通过Chrome网上应用商店安装该程序”的方法

摘要 : 最近有些用户反映某个Chrome插件在安装的时候,提示“只能通过Chrome网上应用商店安装该程序”,为了解决这一问题,Chrome插件网带来了相关的解决方法。 某些用户在Chrome插件网下载了...

沧海一刀
56分钟前
0
0
通过UNIX域套接字传递文件描述符

  传送文件描述符是高并发网络服务编程的一种常见实现方式。Nebula 高性能通用网络框架即采用了UNIX域套接字传递文件描述符设计和实现。本文详细说明一下传送文件描述符的应用。 1. TCP服务...

Bwar
59分钟前
0
0
python操作Excle

# -*- coding: utf-8 -*-from openpyxl import load_workbook, Workbook#index:第几个sheet页,第一个sheet页的index为0def readExcle(filename,index): # 加载excle文件 wb = l......

淺陌离殇
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部