|
9 | 9 | </p>
|
10 | 10 |
|
11 | 11 | <p align="center">
|
12 | | - <a href="#"><img src="https://img.shields.io/wercker/ci/wercker/docs.svg?style=for-the-badge" alt=""></a> |
| 12 | + <a href="#"><img src="https://img.shields.io/badge/Java-Patterns-blue.svg?style=for-the-badge" alt=""></a> |
13 | 13 | <a href="#"><img src="https://img.shields.io/badge/Author-Jason-orange.svg?style=for-the-badge" alt=""></a>
|
14 | 14 | </p>
|
15 | 15 |
|
|
19 | 19 |
|
20 | 20 |
|
21 | 21 | # patterns
|
22 | | -* Project:patternsss |
| 22 | +* Project:Java-Patterns |
23 | 23 | * OfficialWebsite:http://patterns.ucaner.cn
|
24 | 24 | * describe:设计模式学习笔记
|
25 | 25 |
|
|
58 | 58 | * 合成复用原则(Composite Reuse Principle)
|
59 | 59 | 原则是尽量使用合成/聚合的方式,而不是使用继承。
|
60 | 60 |
|
61 | | -# 责任链模式 |
62 | | -* 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。 |
63 | | -* 具体处理者(BossHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。 |
| 61 | +# 工厂方法模式 |
| 62 | +* 工厂模式,属于类创建型模式,工厂父类(接口)负责定义产品对象的公共接口,而子类工厂则负责创建具体的产品对象。 |
| 63 | +* 目的:是为了把产品的实例化操作延迟到子类工厂中完成,通过工厂子类来决定究竟应该实例化哪一个产品具体对象。 |
| 64 | ++ 工厂方法模式包含**四个**部分: |
| 65 | + - 1.抽象产品:产品对象同一的基类,或者是同一的接口 |
| 66 | + - 2.具体的产品:各个不同的实例对象类 |
| 67 | + - 3.抽象工厂:所有的子类工厂类的基类,或是同一的接口 |
| 68 | + - 4.具体的工厂子类:负责每个不同的产品对象的实际创建 |
| 69 | + |
| 70 | +```java |
| 71 | +package cn.ucaner.pattern.create.factory.factory; |
| 72 | + |
| 73 | +import cn.ucaner.pattern.create.factory.AbsHumanFactory; |
| 74 | +import cn.ucaner.pattern.create.factory.Human; |
| 75 | + |
| 76 | +/** |
| 77 | +* @Package:cn.ucaner.pattern.create.factory.factory |
| 78 | +* @ClassName:HumanFactory |
| 79 | +* @Description: <p> 工厂模式 --- 具体工厂 - human 工厂 extends abs humanFactory </p> |
| 80 | +* @Author: - |
| 81 | +* @CreatTime:2017年10月26日 下午5:46:37 |
| 82 | +* @Modify By: |
| 83 | +* @ModifyTime: |
| 84 | +* @Modify marker: |
| 85 | +* @version V1.0 |
| 86 | + */ |
| 87 | +public class HumanFactory extends AbsHumanFactory { |
| 88 | + |
| 89 | + @SuppressWarnings("unchecked") |
| 90 | + @Override |
| 91 | + public <T extends Human> T createHumen(Class<T> tClass) { |
| 92 | + Human humen=null; |
| 93 | + try { |
| 94 | + humen= (T) Class.forName(tClass.getName()).newInstance(); |
| 95 | + } catch (InstantiationException e) { |
| 96 | + e.printStackTrace(); |
| 97 | + } catch (IllegalAccessException e) { |
| 98 | + e.printStackTrace(); |
| 99 | + } catch (ClassNotFoundException e) { |
| 100 | + e.printStackTrace(); |
| 101 | + } |
| 102 | + return (T)humen; |
| 103 | + } |
| 104 | +} |
| 105 | + |
| 106 | +``` |
| 107 | +`具体的实现类` |
| 108 | +```java |
| 109 | +//黑种人 |
| 110 | +public class BlackHuman implements Human { |
| 111 | + |
| 112 | + @Override |
| 113 | + public void getColor() { |
| 114 | + System.out.println("黑色人种"); |
| 115 | + } |
| 116 | +} |
| 117 | + |
| 118 | +//白种人 |
| 119 | +public class WhiteHuman implements Human { |
| 120 | + |
| 121 | + @Override |
| 122 | + public void getColor() { |
| 123 | + System.out.println("白色人种"); |
| 124 | + } |
| 125 | +} |
| 126 | + |
| 127 | +//黄种人 |
| 128 | +public class YellowHuman implements Human { |
| 129 | + |
| 130 | + @Override |
| 131 | + public void getColor() { |
| 132 | + System.out.println("黄色人种"); |
| 133 | + } |
| 134 | +} |
| 135 | + |
| 136 | +``` |
| 137 | +`抽象工厂` |
| 138 | +```java |
| 139 | +package cn.ucaner.pattern.create.factory; |
| 140 | + |
| 141 | +/** |
| 142 | +* @Package:cn.ucaner.pattern.create.factory |
| 143 | +* @ClassName:AbsHumanFactory |
| 144 | +* @Description: <p> 工厂模式 --- 抽象出来的工厂</p> |
| 145 | +* @Author: - |
| 146 | +* @CreatTime:2017年10月26日 下午5:50:00 |
| 147 | +* @Modify By: |
| 148 | +* @ModifyTime: |
| 149 | +* @Modify marker: |
| 150 | +* @version V1.0 |
| 151 | + */ |
| 152 | +public abstract class AbsHumanFactory { |
| 153 | + |
| 154 | + public abstract <T extends Human> T createHumen(Class<T> tClass); |
| 155 | + |
| 156 | +} |
| 157 | + |
| 158 | +``` |
| 159 | +```java |
| 160 | +/** |
| 161 | +* 工厂类测试 传入对应的实体 创建对应的对象 |
| 162 | +*/ |
| 163 | +public class FactoryMain { |
| 164 | + |
| 165 | + public static void main(String[] args) { |
| 166 | + //初始化一个工厂 |
| 167 | + AbsHumanFactory humanFactory = new HumanFactory(); |
| 168 | + |
| 169 | + //建造一个黄种人 |
| 170 | + Human yellowHuman = humanFactory.createHumen(YellowHuman.class); |
| 171 | + yellowHuman.getColor(); |
| 172 | + |
| 173 | + //建造一个黑人 |
| 174 | + Human blackHuman = humanFactory.createHumen(BlackHuman.class); |
| 175 | + blackHuman.getColor(); |
| 176 | + |
| 177 | + //建造一个白人 |
| 178 | + Human whiteHuman = humanFactory.createHumen(WhiteHuman.class); |
| 179 | + whiteHuman.getColor(); |
| 180 | + |
| 181 | + } |
| 182 | +} |
| 183 | + |
| 184 | +``` |
| 185 | + |
| 186 | +# 单例模式 |
| 187 | +* |
| 188 | +* |
64 | 189 |
|
| 190 | +# 建造者模式 |
| 191 | +* |
| 192 | +* |
65 | 193 |
|
66 | | -# 命令模式 |
| 194 | +# 原型模式 |
67 | 195 | *
|
68 | 196 | *
|
69 | 197 |
|
70 | | -# 观察者模式 |
| 198 | +# 适配器模式 |
71 | 199 | *
|
72 | 200 | *
|
73 | 201 |
|
74 | | -# 状态模式 |
| 202 | +# 代理模式 |
75 | 203 | *
|
76 | 204 | *
|
77 | 205 |
|
78 | | -# 访问者模式 |
| 206 | +# 外观模式 |
| 207 | +* |
| 208 | +* |
| 209 | + |
| 210 | +# 桥接模式 |
| 211 | +* |
| 212 | +* |
| 213 | + |
| 214 | +# 组合模式 |
79 | 215 | *
|
80 | 216 | *
|
81 | 217 |
|
82 | 218 | # 享元模式
|
| 219 | +* |
| 220 | +* |
| 221 | + |
| 222 | + |
| 223 | +# 责任链模式 |
| 224 | +* 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。 |
| 225 | +* 具体处理者(BossHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。 |
| 226 | + |
83 | 227 |
|
| 228 | +# 命令模式 |
| 229 | +* 将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。 |
| 230 | +* 命令模式的定义比较复杂,提到了很多术语,例如"用不同的请求对客户进行参数化"、"对请求排队","记录请求日志"、"支持可撤销操作"等,在后面我们将对这些术语进行一一讲解 |
| 231 | + |
| 232 | +# 观察者模式 |
| 233 | +* 在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新 |
| 234 | +* 其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息 |
| 235 | + |
| 236 | +# 状态模式 |
| 237 | +* 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类 |
| 238 | +* 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。 |
| 239 | +* 2.一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。 |
| 240 | + |
| 241 | + |
| 242 | +# 访问者模式 |
| 243 | +* 访问者模式是对象的行为模式。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变 |
| 244 | +* 变量被声明时的类型叫做变量的静态类型(Static Type),有些人又把静态类型叫做明显类型(Apparent Type);而变量所引用的对象的真实类型又叫做变量的实际类型(Actual Type)。 |
84 | 245 |
|
| 246 | +# 享元模式 :dog: |
| 247 | +* "享"就是分享之意,指一物被众人共享,而这也正是该模式的终旨所在 |
| 248 | +* 享元模式有点类似于单例模式,都是只生成一个对象来被共享使用。这里有个问题,那就是对共享对象的修改,为了避免出现这种情况,我们将这些对象的公共部分,或者说是不变化的部分抽取出来形成一个对象。这个对象就可以避免到修改的问题。 |
| 249 | +* 享元的目的是为了减少不会要额内存消耗,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,以此来降低内存的消耗。 |
85 | 250 |
|
86 | | -###Emoj |
87 | | -:smile: :dog: :sunny: :zap: :pig: :four_leaf_clover: :watermelon: :kissing_closed_eyes: :full_moon_with_face: |
88 | 251 |
|
89 | 252 |
|
90 | 253 | ### FAQ
|
|
0 commit comments