文档章节

设计模式(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
南京
程序员
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

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

Carson_Ho
04/09
0
0
设计模式-工厂模式/委派模式/代理模式/单例模式

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

森火
09/11
0
0
编程中的那些套路——关于策略模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天讲讲策略模式,策略模式 和工厂模式十分相像(或者说在代码逻辑层面,他们是一样的)。 但策略模式与...

gzchen
08/27
0
0
编程中的那些经典套路——设计模式汇总

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

gzchen
08/27
0
0
javascript 设计模式之工厂(Factory)模式

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

hlxiong
2014/04/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

活动招募 HUAWEI HiAI公开课·北京站-如何在4小时把你的APP变身AI应用

人工智能和机器学习是全球关注的新趋势,也是当前最火爆、最流行的话题。当你拿手机用语音助手帮你点外卖,智能推荐帮你把周边美食一网打尽;当你拿起P20拍照时,它将自动识别场景进行最美优...

华为终端开放实验室
7分钟前
0
0
匹配两位小数,js正则

var regex = /^\d*(\.[1-9]|\.\d[1-9])*$/ console.log(1.2,regex.test(1.2)); console.log(0.3,regex.test(0.3)); console.log(1.03,regex.test(1.03)); ......

微信小程序-暗潮
12分钟前
0
0
905. Sort Array By Parity - LeetCode

Question 905. Sort Array By Parity Solution 题目大意:数组排序,偶数放前,奇数在后,偶数的数之间不用管顺序,奇数的数之间也不用管顺序 思路:建两个list,一个放偶数,一个放奇数,最...

yysue
16分钟前
0
0
h5 禁止手机自带键盘弹出

html: <div style="width: 350px;margin:50px auto;"><input type="text" id="datePicker" class="date_picker form-control" placeholder="点击选择入住日期" /></div> js: $("#date......

Delete90
33分钟前
1
0
color透明度对照表

透明度百分比 数值 100% 不透明 FF 95% F2 90% E6 85% D9 80% CC 75% BF 70% B3 65% A6 60% 99 55% 8C 50% 80 45% 73 40% 66 35% 59 30% 4D 25% 40 20% 33 15% 26 10% 1A 5% 0D 0% 完全透明 ......

_无问西东
35分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部