文档章节

设计模式(1)

jit-hakase
 jit-hakase
发布于 2017/08/22 14:15
字数 1035
阅读 9
收藏 0
点赞 0
评论 0

#设计模式 使用设计模式的原则

  1. 开闭原则(Open Close Principle) 说对扩展开放, 对修改关闭, 在程序需要进行拓展的时候, 不能去修改原有的代码.
  2. 里氏代换原则(Liskov Substitution Principle) 任何基类可以出现的地方, 子类一定可以出现, 只有当衍生类可以替换掉基类, 软件单位的功能不受到影响时, 基类才能真正被复用, 而衍生类也能够在基类的基础上增加新的行为.
  3. 依赖倒转原则(Dependence Inversion Principle) 开闭原则的基础, 针对接口编程, 依赖于抽象而不依赖于具体.
  4. 接口隔离原则(Interface Segregation Principle) 使用多个隔离的接口, 优于使用单个接口, 可以降低类之间的耦合度.
  5. 迪米特法则(Demeter Principle) 又称最少知道原则, 一个实体应当尽量少的与其他实体之间发生相互作用, 使得系统功能模块相对独立.
  6. 合成复用原则(Composite Reuse Principle) 尽量使用合成和聚合的方式, 而不是使用继承.

##创建型模式 ###工厂模式 轻松方便地构造对象实例, 而不必关心构造对象实例的细节和复杂过程.

工厂模式分为工厂方法模式抽象工厂模式

####工厂方法模式(Factory Method)

利用工厂方法模式设计水果工厂

package javatest1;

interface Fruit {
	String getName();
}

class Apple implements Fruit {
	@Override
	public String getName() {
		return "apple";
	}
}

class Banana implements Fruit {
	@Override
	public String getName() {
		return "banana";
	}
}

class FruitFactory {

	public static Apple createApple() {
		return new Apple();
	}

	public static Banana createBanana() {
		return new Banana();
	}
}

public class Main {

	public static void main(String[] args) {

		Fruit apple = FruitFactory.createApple();
		Fruit banana = FruitFactory.createBanana();
		
		System.out.println(apple.getName());
		System.out.println(banana.getName());
	}
}

####抽象工厂模式(Abstract Factory)

利用抽象工厂模式设计水果工厂

package javatest1;

interface Fruit {
	String getName();
}

class Apple implements Fruit {
	@Override
	public String getName() {
		return "apple";
	}
}

class Banana implements Fruit {
	@Override
	public String getName() {
		return "banana";
	}
}

interface FruitFactory {
	Fruit create();
}

class AppleFactory implements FruitFactory {
	@Override
	public Apple create() {
		return new Apple();
	}
}

class BananaFactory implements FruitFactory {
	@Override
	public Banana create() {
		return new Banana();
	}
}

public class Main {

	public static void main(String[] args) {

		FruitFactory appleFactory = new AppleFactory();
		FruitFactory bananaFactory = new BananaFactory();
		
		Fruit apple = appleFactory.create();
		Fruit banana = bananaFactory.create();
		
		System.out.println(apple.getName());
		System.out.println(banana.getName());
	}
}

###单例模式(Singleton) 总有一些类的对象需要是唯一的, 这时可以考虑使用单例模式. 单例模式的优点: 严格控制对象的数目, 访问方式和封装.

地球单例模式

class Earth {

	private static Earth earth = new Earth();
	
	private Earth() {}
	
	public static Earth getInstance() {
		return earth;
	}
}

public class Main {

	public static void main(String[] args) {

		Earth foo = Earth.getInstance();
		Earth bar = Earth.getInstance();
		
		if (foo == bar) {
			System.out.println("Singleton");
		}
	}
}

###建造者模式(Builder)

将复杂对象的创建工作分解成方法, 通常可以设计成连缀方法, 最后返回构造完的对象.

使用建造者模式来建造水果盒子

import java.util.ArrayList;
import java.util.List;

interface Fruit {
	String getName();
}

class Apple implements Fruit {
	@Override
	public String getName() {
		return "apple";
	}
}

class Banana implements Fruit {
	@Override
	public String getName() {
		return "banana";
	}
}

class FruitBox {

	private List<Fruit> fruitList = new ArrayList<>();
	
	public void add(Fruit fruit) {
		fruitList.add(fruit);
	}

	public List<Fruit> getFruitList() {
		return fruitList;
	}
}

class FruitBoxBuilder {

	private FruitBox fruitBox = new FruitBox();
	
	public FruitBoxBuilder append(Fruit fruit) {
		fruitBox.add(fruit);
		return this;
	}

	public List<Fruit> toList() {
		return fruitBox.getFruitList();
	}
}

public class Main {

	public static void main(String[] args) {

		Fruit apple = new Apple();
		Fruit banana = new Banana();
		
		FruitBoxBuilder builder = new FruitBoxBuilder();
		List<Fruit> fruitList = builder.append(apple).append(banana).toList();
		
		for (Fruit fruit : fruitList) {
			System.out.println(fruit.getName());
		}
	}
}

类库中使用建造者模式的StringBuilder

public class Main {

	public static void main(String[] args) {

		StringBuilder sb = new StringBuilder();
		String result = sb.append("hello").append(" java !").toString();

		System.out.println(result);
	}
}

###原型模式(Prototype) 原型模式可以使用预定义的原型对象来快速完成对象的创建

使用原型模式来创建颜色对象

import java.util.HashMap;
import java.util.Map;

interface ColorPrototype {
	void display();
}

class Color implements ColorPrototype {

	private int red, green, blue;
	
	public Color(Color color) {
		this.red = color.red;
		this.green = color.green;
		this.blue = color.blue;
	}
	
	public Color(int red, int green, int blue) {
		this.red = red;
		this.green = green;
		this.blue = blue;
	}
	
	@Override
	public void display() {
		String rgb = "RGB(" + this.red + ", " + this.green +
				", " + this.blue + ")";
		System.out.println(rgb);
	}
	
	public int getRed() { return red; }
	public void setRed(int red) { this.red = red; }
	public int getGreen() { return green; }
	public void setGreen(int green) { this.green = green; }
	public int getBlue() { return blue; }
	public void setBlue(int blue) { this.blue = blue; }
}

class ColorManager {
	
	Map<String, Color> colors = new HashMap<>();
	
	public void addPrototype(String key, Color color) {
		colors.put(key, color);
	}
	
	public Color getPrototype(String key) {
		
		Color color = colors.get(key);
		Color colorCopy = new Color(color);
		
		return colorCopy;
	}
}

public class Main {
	
	public static void main(String[] args) {
		
		ColorManager colorManager = new ColorManager();
		
		colorManager.addPrototype("red", new Color(255, 0, 0));
		colorManager.addPrototype("green", new Color(0, 255, 0));
		colorManager.addPrototype("blue", new Color(0, 0, 255));
		
		Color colorYellow = colorManager.getPrototype("red");
		colorYellow.setGreen(255);
		colorYellow.display();
	}
}

© 著作权归作者所有

jit-hakase
粉丝 0
博文 26
码字总数 30408
作品 0
南京
程序员
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

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

Carson_Ho
04/09
0
0
javascript 设计模式之工厂(Factory)模式

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

hlxiong
2014/04/14
0
0
JavaScript常用设计模式

设计模式 设计模式是一种在长时间的经验与错误中总结出来可服用的解决方案。 设计模式主要分为3类: 创建型设计模式:专注于处理对象的创建 Constructor构造器模式,Factory工厂模式,Singl...

a独家记忆
07/13
0
0
系统架构技能之设计模式-单件模式

一、开篇 其实我本来不是打算把系统架构中的一些设计模式单独抽出来讲解的,因为很多的好朋友也比较关注这方面的内容,所以我想通过我理解及平时项目中应用到的一 些常见的设计模式,拿出来给...

wbf961127
2017/11/12
0
0
java设计模式-- 单例模式

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

爱学习的逃课君
2014/11/27
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
迈向大牛的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后,大牛只需潇洒地敲敲键...

一枚Sir
2015/04/10
0
0
【设计模式笔记】(十六)- 代理模式

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

MrTrying
06/24
0
0
Tomcat 系统架构与设计模式_ 设计模式分析

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

lvzjane
2014/11/03
0
0
JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云
05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

upstream sent too big header while reading...

nginx 报错:1736 upstream sent too big header while reading response header from upstream 1. 一般处理 location ~ \.php$ { #增加下面两句 fastcgi_buffer_size 128k; ......

dubox
6分钟前
0
0
Python解析配置文件模块:ConfigPhaser

import configparser as pa# [SectionA]# a = aa# b = bb# c = cc# [SectionB]# optionint = 1# optionfloat = 1.1# optionstring = string#https://www.cnblogs.com/a......

易野
12分钟前
0
0
Java基础——面向对象

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Object的方法: clone() Object 克隆 to Strin...

凯哥学堂
14分钟前
0
0
rabbitmq学习记录(八)消息发布确认机制

RabbitMQ服务器崩了导致的消息数据丢失,已经持久化的消息数据我们可以通过消息持久化来预防。但是,如果消息从生产者发送到vhosts过程中出现了问题,持久化消息数据的方案就无效了。 Rabbit...

人觉非常君
18分钟前
0
0
毕业5年,我是怎么成为年薪30W的运维工程师

#转载# 我在大学读的是计算机专业,但大学毕业之后,进入到一家私企进行工作,工作的内容类似于网管,会经常的去修电脑,去做水晶头等内容。刚开始工作,也没想太多,最想的是丰富自己的工作...

Py爱好
26分钟前
0
0
大数据基础知识,大数据学习,涉及的知识点

一、什么是大数据 一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库软件工具能力范围的数据集合,具有海量的数据规模、快速的数据流 转、多样的数据类型和价值密度低四大特征。...

董黎明
41分钟前
0
0
Linux CentOS 7上安装极点五笔

话说几天前在新买的惠普笔记本上成功地安装了Linux CentOS 7操作系统、Nvidia Quandro P600驱动程序及X Window,并在VMware下安装Red Hat教学环境,彻底跳出Windows的苦海,但仍然有一件事不...

大别阿郎
53分钟前
15
0
2018年7月20日集群课程

一、集群介绍 集群,简单地说是指一组(若干个)相互独立的计算机,利用高速通信网络组成一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。 ...

人在艹木中
56分钟前
0
0
spark开发机中调试snappy

目的 在Idea中的点击运行,使spark可以直接读取snappy 自己编译hadoop,以支持snappy的压缩。 自己编译的目的就是要得到支持snappy文件读写的动态链接库。如果可以在网上下载,可以跳过自行编...

benny周
今天
0
0
centos7 安装docker

1,查看系统版本 cat /etc/redhat-release 2,安装gcc yum -y install gccyum -y install gcc-c++ 3,卸载旧版本 yum remove docker \ docker-client \ ......

暗中观察
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部