文档章节

设计模式(1)

jit-hakase
 jit-hakase
发布于 2017/08/22 14:15
字数 1035
阅读 9
收藏 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
南京
程序员
私信 提问
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
11/06
0
0
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

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

Carson_Ho
04/09
0
0
设计模式知识汇总(附github分享)

写在前面 主要内容 为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也...

landy8530
10/10
0
0
编程中的那些经典套路——设计模式汇总

在正式阅读前,我先谈谈我们该用什么姿势和心态学习设计模式: 如果你还没有过多的编程经验(泛指半年以下),我建议你把它当做小说来看,能看懂多少是多少,因为半年以下经验的程序员用到设...

gzchen
08/27
0
0
设计模式-工厂模式/委派模式/代理模式/单例模式

1.工厂模式:spring中运用的都是工厂模式,不参与业务的枚举就是工厂模式,所有人均可以调用,工厂模式就是在底层框架中写好. 例如:new 了一个Map 那这个Map创造的过程其实是底层工厂模式代码创造...

森火
09/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

降压变换器 Buck

特点 输入输出极性相同。 工作过程 在 MOS 导通时,输入电源通过 L 和 C 滤波后向负载端提供电流;当 MOS 断开后,L 通过二极管续流,保持负载电流连续。输出电压因为占空比的作用,不会超过...

colinux
今天
1
0
Apache日志不记录访问静态文件,访问日志切割,静态元素过期时间设置

Apache配置不记录访问静态文件的日志 网站大多元素为静态文件,如图片、css、js等,这些元素可以不用记录 vhost原始配置 <VirtualHost *:80> ServerAdmin test@163.com DocumentRoo...

野雪球
今天
3
0
聊聊storm的ICommitterTridentSpout

序 本文主要研究一下storm的ICommitterTridentSpout ICommitterTridentSpout storm-core-1.2.2-sources.jar!/org/apache/storm/trident/spout/ICommitterTridentSpout.java public interface......

go4it
今天
4
0
Ubuntu常用操作

查看端口号 netstat -anp |grep 端口号 查看已使用端口情况 netstat -nultp(此处不用加端口号) netstat -anp |grep 82查看82端口的使用情况 查找被占用的端口: netstat -tln netstat -tl...

hc321
昨天
3
0
网站cdn的静态资源突然访问变的缓慢,问题排查流程

1.首先我查看了一下是否自己的网络问题,通过对比其他资源的访问速度和下载速度,确认不是 2.通过ping 和 tracert 判断cdn域名能否正常访问,(最后回想感觉这一步可以省略,因为每次最终能访...

小海bug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部