From e0a406751e904fb0613dc54a9cfd3bcde903bfe7 Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sat, 15 Jul 2017 19:15:31 +0800 Subject: [PATCH 01/51] =?UTF-8?q?add=20>=20=E5=8D=95=E4=BE=8B=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=EF=BC=886=E7=A7=8D=E5=AE=9E=E7=8E=B0=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../java/creational/SingletonPattern.java | 119 ++++++++++++++++++ 2 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 design-pattern/src/main/java/creational/SingletonPattern.java diff --git a/README.md b/README.md index 8120c37..8296635 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ - 抽象工厂模式(Abstract Factory) - 创建者模式(Builder) - 原型模式(Prototype) - - 单例模式(Singleton) + - [单例模式(Singleton)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/SingletonPattern.java) - [结构型模式(Structural)](https://github.com/lihengming/java-codes/tree/master/design-pattern/src/main/java/structural) - 外观模式(Facade) - 适配器模式(Adapter) diff --git a/design-pattern/src/main/java/creational/SingletonPattern.java b/design-pattern/src/main/java/creational/SingletonPattern.java new file mode 100644 index 0000000..d1503c3 --- /dev/null +++ b/design-pattern/src/main/java/creational/SingletonPattern.java @@ -0,0 +1,119 @@ +package creational; + +import org.junit.Assert; + +import java.util.Objects; + +/** + * Created by 李恒名 on 2017/7/15. + */ +public class SingletonPattern { + /** + * 懒汉式,线程不安全,在使用时初始化示例(懒加载) + */ + static class Singleton1 { + private static Singleton1 instance; + + private Singleton1() { + new AssertionError("don't support reflect."); + } + + public static Singleton1 getInstance() { + if (instance == null) { + instance = new Singleton1(); + } + return instance; + } + } + + /** + * 懒汉式,线程安全,在使用时初始化示例(懒加载) + */ + static class Singleton2 { + private static Singleton2 instance; + + private Singleton2() { + new AssertionError("don't support reflect."); + } + + public static synchronized Singleton2 getInstance() { + if (instance == null) { + instance = new Singleton2(); + } + return instance; + } + } + + /** + * 懒汉式线程安全的优化写法,双重检验锁模式(double checked locking pattern) + */ + static class Singleton3 { + private volatile static Singleton3 instance; + + private Singleton3() { + new AssertionError("don't support reflect."); + } + + public static Singleton3 getInstance() { + if (instance == null) { // Single Checked + synchronized (Singleton3.class) { + if (instance == null) { // Double checked + instance = new Singleton3(); + } + } + } + return instance; + } + } + + /** + * 饿汉式 static final field,在类被被类加载器加载时便创建实例 + */ + static class Singleton4 { + + private static final Singleton4 instance = new Singleton4(); + + private Singleton4() { + new AssertionError("don't support reflect."); + } + + public static Singleton4 getInstance() { + return instance; + } + } + + + /** + * 使用静态内部类 static nested class ,这种方法是《Effective Java》上所推荐的 + */ + static class Singleton5 { + private static class SingletonHolder { + private static final Singleton5 INSTANCE = new Singleton5(); + } + + private Singleton5() { + new AssertionError("don't support reflect."); + } + + public static final Singleton5 getInstance() { + return SingletonHolder.INSTANCE; + } + } + + /** + * 使用枚举,这也是单例模式最简单的实现 ,这种方法也是《Effective Java》上所推荐的 + */ + public enum Singleton6 { + INSTANCE; + } + + public static void main(String[] args) { + Assert.assertTrue(Objects.equals(Singleton1.getInstance(), Singleton1.getInstance())); + Assert.assertTrue(Objects.equals(Singleton1.getInstance(), Singleton1.getInstance())); + Assert.assertTrue(Objects.equals(Singleton2.getInstance(), Singleton2.getInstance())); + Assert.assertTrue(Objects.equals(Singleton3.getInstance(), Singleton3.getInstance())); + Assert.assertTrue(Objects.equals(Singleton4.getInstance(), Singleton4.getInstance())); + Assert.assertTrue(Objects.equals(Singleton5.getInstance(), Singleton5.getInstance())); + Assert.assertTrue(Objects.equals(Singleton6.INSTANCE, Singleton6.INSTANCE)); + } +} From 2aca954cb710f4b1bc3928e88271278a9efb1ef1 Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 12:17:12 +0800 Subject: [PATCH 02/51] =?UTF-8?q?add=20>=20=E5=88=9B=E5=BB=BA=E8=80=85?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/creational/BuilderPattern.java | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 design-pattern/src/main/java/creational/BuilderPattern.java diff --git a/design-pattern/src/main/java/creational/BuilderPattern.java b/design-pattern/src/main/java/creational/BuilderPattern.java new file mode 100644 index 0000000..aad7e5d --- /dev/null +++ b/design-pattern/src/main/java/creational/BuilderPattern.java @@ -0,0 +1,80 @@ +package creational; + +/** + * Created by Potato on 2017/7/16. + *
+ * 创建者模式 + *
+ * 当创造一个对象需要很多步骤时适合使用建造者模式。而当只需调用一个方法就可以简单地创建整个对象时适合使用工厂模式。 + * + * @see StringBuilder + * @see StringBuffer + * @see java.sql.PreparedStatement + * @see javax.swing.GroupLayout.Group + */ +public class BuilderPattern { + + /** + * 被创建的对象,以手机为例。 + */ + static class Phone { + private String displayScreen;//显示器 + private String battery;//电池 + private String camera;//摄像头 + private String operatingSystem;//操作系统 + + public String getDisplayScreen() { + return displayScreen; + } + + public void setDisplayScreen(String displayScreen) { + this.displayScreen = displayScreen; + } + + public String getBattery() { + return battery; + } + + public void setBattery(String battery) { + this.battery = battery; + } + + public String getCamera() { + return camera; + } + + public void setCamera(String camera) { + this.camera = camera; + } + + public String getOperatingSystem() { + return operatingSystem; + } + + public void setOperatingSystem(String operatingSystem) { + this.operatingSystem = operatingSystem; + } + } + + static class PhoneBuilder { + public Phone build(){ + Phone phone = new Phone(); + phone.setBattery("三星电池"); + phone.setCamera("索尼摄像头"); + phone.setDisplayScreen("三星显示器"); + phone.setOperatingSystem("IOS 10 操作系统"); + System.out.println(String.format("手机创建完成,使用%s、%s、%s、%s。", + phone.getBattery(), + phone.getCamera(), + phone.getDisplayScreen(), + phone.getOperatingSystem())); + return phone; + } + } + + public static void main(String[] args) { + PhoneBuilder builder = new PhoneBuilder(); + Phone phone = builder.build(); + //手机创建完成,使用三星电池、索尼摄像头、三星显示器、IOS 10 操作系统。 + } +} From 9f9c20fd29ea6b2ae4ac6b74d241b6884f66bdbc Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 12:17:38 +0800 Subject: [PATCH 03/51] =?UTF-8?q?update=20>=20=E5=8D=95=E5=88=A9=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=EF=BC=886=E7=A7=8D=E5=AE=9E=E7=8E=B0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design-pattern/src/main/java/creational/SingletonPattern.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/design-pattern/src/main/java/creational/SingletonPattern.java b/design-pattern/src/main/java/creational/SingletonPattern.java index d1503c3..a7c06f9 100644 --- a/design-pattern/src/main/java/creational/SingletonPattern.java +++ b/design-pattern/src/main/java/creational/SingletonPattern.java @@ -6,6 +6,10 @@ /** * Created by 李恒名 on 2017/7/15. + *
+ * 单例模式,即只允许存在一个类的实例 + * + * @see java.lang.Runtime#getRuntime() */ public class SingletonPattern { /** From 06003615c49e955244d93df7d0121a2724ab30cd Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 12:18:23 +0800 Subject: [PATCH 04/51] =?UTF-8?q?update=20>=20=E5=8D=95=E4=BE=8B=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=EF=BC=886=E7=A7=8D=E5=AE=9E=E7=8E=B0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design-pattern/src/main/java/creational/SingletonPattern.java | 1 - 1 file changed, 1 deletion(-) diff --git a/design-pattern/src/main/java/creational/SingletonPattern.java b/design-pattern/src/main/java/creational/SingletonPattern.java index a7c06f9..0cedd8e 100644 --- a/design-pattern/src/main/java/creational/SingletonPattern.java +++ b/design-pattern/src/main/java/creational/SingletonPattern.java @@ -86,7 +86,6 @@ public static Singleton4 getInstance() { } } - /** * 使用静态内部类 static nested class ,这种方法是《Effective Java》上所推荐的 */ From 29258268f26ecc038f89717a20e7316cc4b8b7ab Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 12:18:47 +0800 Subject: [PATCH 05/51] =?UTF-8?q?update=20>=20=E5=B7=A5=E5=8E=82=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/creational/FactoryMethodPattern.java | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/design-pattern/src/main/java/creational/FactoryMethodPattern.java b/design-pattern/src/main/java/creational/FactoryMethodPattern.java index a93fec0..43a9e77 100644 --- a/design-pattern/src/main/java/creational/FactoryMethodPattern.java +++ b/design-pattern/src/main/java/creational/FactoryMethodPattern.java @@ -6,18 +6,11 @@ * 工厂方法模式 */ public class FactoryMethodPattern { - - public static void main(String[] args) { - CarFactory factory = new BenzFactory(); - //CarFactory factory = new BMWFactory(); - Car car = factory.getCar(); - car.run(); - } - + //汽车抽象 static abstract class Car { abstract void run(); } - + //奔驰汽车 static class Benz extends Car { @Override @@ -25,7 +18,7 @@ void run() { System.out.println("奔驰车在跑"); } } - + //宝马汽车 static class BMW extends Car { @Override @@ -33,23 +26,29 @@ void run() { System.out.println("宝马车在跑"); } } - + //抽象的汽车工厂 static abstract class CarFactory { - abstract Car getCar(); + public abstract Car getCar(); } - + //奔驰汽车工厂,getCar()方法可以修改为静态方法 static class BenzFactory extends CarFactory { @Override - Car getCar() { + public Car getCar() { return new Benz(); } } - + //宝马汽车工厂,getCar()方法可以修改为静态方法 static class BMWFactory extends CarFactory { @Override - Car getCar() { + public Car getCar() { return new BMW(); } } + public static void main(String[] args) { + CarFactory factory = new BenzFactory(); + //CarFactory factory = new BMWFactory(); + Car car = factory.getCar(); + car.run(); + } } From b5b50e29ea8decef6eafeba5fae47ec8ec6380ee Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 12:19:01 +0800 Subject: [PATCH 06/51] =?UTF-8?q?update=20>=20=E7=AE=80=E5=8D=95=E5=B7=A5?= =?UTF-8?q?=E5=8E=82=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/creational/SimpleFactoryPattern.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/design-pattern/src/main/java/creational/SimpleFactoryPattern.java b/design-pattern/src/main/java/creational/SimpleFactoryPattern.java index 88a9cd1..bd551b2 100644 --- a/design-pattern/src/main/java/creational/SimpleFactoryPattern.java +++ b/design-pattern/src/main/java/creational/SimpleFactoryPattern.java @@ -6,18 +6,11 @@ * 简单工厂模式 */ public class SimpleFactoryPattern { - - public static void main(String[] args) { - CarFactory factory = new CarFactory(); - Car car = factory.getCar("Benz"); - //Car car = factory.getCar("BMW"); - car.run(); - } - + //汽车抽象 static abstract class Car { abstract void run(); } - + //奔驰汽车 static class Benz extends Car { @Override @@ -25,7 +18,7 @@ void run() { System.out.println("奔驰车在跑"); } } - + //宝马汽车 static class BMW extends Car { @Override @@ -33,7 +26,7 @@ void run() { System.out.println("宝马车在跑"); } } - + //汽车工厂,根据汽车名称创建汽车 static class CarFactory { Car getCar(String name) { if (name.equals("Benz")) { @@ -45,5 +38,12 @@ Car getCar(String name) { } } } + + public static void main(String[] args) { + CarFactory factory = new CarFactory(); + Car car = factory.getCar("Benz"); + //Car car = factory.getCar("BMW"); + car.run(); + } } From 2dbcf3eec7831aeec868cacf1b61433c7267d086 Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 12:20:03 +0800 Subject: [PATCH 07/51] =?UTF-8?q?add=20>=20=E5=88=9B=E5=BB=BA=E8=80=85?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8296635..3a4b44f 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ - [简单工厂模式(Simple Factory)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/SimpleFactoryPattern.java) - [工厂方法模式(Factory Method)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/FactoryMethodPattern.java) - 抽象工厂模式(Abstract Factory) - - 创建者模式(Builder) + - [创建者模式(Builder)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/BuilderPattern.java) - 原型模式(Prototype) - [单例模式(Singleton)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/SingletonPattern.java) - [结构型模式(Structural)](https://github.com/lihengming/java-codes/tree/master/design-pattern/src/main/java/structural) From 94ddfa645744900893810592b346b658f3b5458c Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 19:18:10 +0800 Subject: [PATCH 08/51] =?UTF-8?q?update=20>=20=E5=B7=A5=E5=8E=82=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/creational/FactoryMethodPattern.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/design-pattern/src/main/java/creational/FactoryMethodPattern.java b/design-pattern/src/main/java/creational/FactoryMethodPattern.java index 43a9e77..496f147 100644 --- a/design-pattern/src/main/java/creational/FactoryMethodPattern.java +++ b/design-pattern/src/main/java/creational/FactoryMethodPattern.java @@ -30,14 +30,14 @@ void run() { static abstract class CarFactory { public abstract Car getCar(); } - //奔驰汽车工厂,getCar()方法可以修改为静态方法 + //奔驰汽车工厂 static class BenzFactory extends CarFactory { @Override public Car getCar() { return new Benz(); } } - //宝马汽车工厂,getCar()方法可以修改为静态方法 + //宝马汽车工厂 static class BMWFactory extends CarFactory { @Override public Car getCar() { From f83d181dc116f6544960241da552d74d2872c584 Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 19:42:21 +0800 Subject: [PATCH 09/51] =?UTF-8?q?update=20>=20=E5=88=9B=E5=BB=BA=E8=80=85?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/creational/BuilderPattern.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/design-pattern/src/main/java/creational/BuilderPattern.java b/design-pattern/src/main/java/creational/BuilderPattern.java index aad7e5d..3739873 100644 --- a/design-pattern/src/main/java/creational/BuilderPattern.java +++ b/design-pattern/src/main/java/creational/BuilderPattern.java @@ -3,10 +3,8 @@ /** * Created by Potato on 2017/7/16. *
- * 创建者模式 - *
- * 当创造一个对象需要很多步骤时适合使用建造者模式。而当只需调用一个方法就可以简单地创建整个对象时适合使用工厂模式。 - * + * 创建者模式,当创造一个对象需要很多步骤时适合使用建造者模式。而当只需调用一个方法 + * 就可以简单地创建整个对象时适合使用工厂模式。 * @see StringBuilder * @see StringBuffer * @see java.sql.PreparedStatement @@ -77,4 +75,13 @@ public static void main(String[] args) { Phone phone = builder.build(); //手机创建完成,使用三星电池、索尼摄像头、三星显示器、IOS 10 操作系统。 } + + /** + * 总结: + * 建造者模式将复杂产品的构建过程封装分解在不同的方法中,使得创建过程非常清晰,能够 + * 让我们更加精确的控制复杂产品对象的创建过程,同时它隔离了复杂产品对象的创建和使用 + * ,使得相同的创建过程能够创建不同的产品。但是如果某个产品的内部结构过于复杂,将会 + * 导致整个系统变得非常庞大,不利于控制,同时若几个产品之间存在较大的差异,则不适用 + * 建造者模式,毕竟这个世界上存在相同点大的两个产品并不是很多,所以它的使用范围有限。 + */ } From 6529c0dad45e03cdac02311628c78fba68449af6 Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 19:42:44 +0800 Subject: [PATCH 10/51] =?UTF-8?q?update=20>=20=E7=AE=80=E5=8D=95=E5=B7=A5?= =?UTF-8?q?=E5=8E=82=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/creational/SimpleFactoryPattern.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/design-pattern/src/main/java/creational/SimpleFactoryPattern.java b/design-pattern/src/main/java/creational/SimpleFactoryPattern.java index bd551b2..3ae9457 100644 --- a/design-pattern/src/main/java/creational/SimpleFactoryPattern.java +++ b/design-pattern/src/main/java/creational/SimpleFactoryPattern.java @@ -3,7 +3,7 @@ /** * Created by 李恒名 on 2017/6/14. *
- * 简单工厂模式 + * 简单工厂模式,简单来说就是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(该模式并不属于GOF 23) */ public class SimpleFactoryPattern { //汽车抽象 @@ -12,7 +12,6 @@ static abstract class Car { } //奔驰汽车 static class Benz extends Car { - @Override void run() { System.out.println("奔驰车在跑"); @@ -20,7 +19,6 @@ void run() { } //宝马汽车 static class BMW extends Car { - @Override void run() { System.out.println("宝马车在跑"); From 778bc4c7f5b57804324823eab8d3781244217e0a Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 19:43:06 +0800 Subject: [PATCH 11/51] =?UTF-8?q?update=20>=20=E5=8D=95=E4=BE=8B=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=EF=BC=886=E7=A7=8D=E5=AE=9E=E7=8E=B0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design-pattern/src/main/java/creational/SingletonPattern.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/design-pattern/src/main/java/creational/SingletonPattern.java b/design-pattern/src/main/java/creational/SingletonPattern.java index 0cedd8e..f73fec5 100644 --- a/design-pattern/src/main/java/creational/SingletonPattern.java +++ b/design-pattern/src/main/java/creational/SingletonPattern.java @@ -7,7 +7,7 @@ /** * Created by 李恒名 on 2017/7/15. *
- * 单例模式,即只允许存在一个类的实例 + * 单例模式,即一个类只允许存在一个实例。 * * @see java.lang.Runtime#getRuntime() */ From 95af27230b395f61544cc4d98de74e0e4d437647 Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 19:43:32 +0800 Subject: [PATCH 12/51] update > package-info --- .../src/main/java/creational/package-info.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/design-pattern/src/main/java/creational/package-info.java b/design-pattern/src/main/java/creational/package-info.java index 6c8399d..c0e2ccd 100644 --- a/design-pattern/src/main/java/creational/package-info.java +++ b/design-pattern/src/main/java/creational/package-info.java @@ -1,5 +1,15 @@ /** * 创建型模式 - * + *
+ * 在软件工程中,创建型模式是处理对象创建的设计模式,试图根据实际情况使用 + * 合适的方式创建对象。基本的对象创建方式可能会导致设计上的问题,或增加设 + * 计的复杂度。创建型模式通过以某种方式控制对象的创建来解决问题。 + *
+ * 创建型模式由两个主导思想构成。一是将系统使用的具体类封装起来,二是隐藏 + * 这些具体类的实例创建和结合的方式。 + *
+ * 创建型模式又分为对象创建型模式和类创建型模式。对象创建型模式处理对象的 + * 创建,类创建型模式处理类的创建。详细地说,对象创建型模式把对象创建的一 + * 部分推迟到另一个对象中,而类创建型模式将它对象的创建推迟到子类中。 */ package creational; \ No newline at end of file From f9a0622d5fdb97082c6b885717c77f6e692ddebf Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 19:45:05 +0800 Subject: [PATCH 13/51] =?UTF-8?q?update=20>=20=E5=B7=A5=E5=8E=82=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/creational/FactoryMethodPattern.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/design-pattern/src/main/java/creational/FactoryMethodPattern.java b/design-pattern/src/main/java/creational/FactoryMethodPattern.java index 496f147..eea01d1 100644 --- a/design-pattern/src/main/java/creational/FactoryMethodPattern.java +++ b/design-pattern/src/main/java/creational/FactoryMethodPattern.java @@ -50,5 +50,17 @@ public static void main(String[] args) { Car car = factory.getCar(); car.run(); } + + /** + * 总结: + * 作为抽象工厂模式的孪生兄弟,工厂方法模式定义了一个创建对象的接口,但由子类决定要 + * 实例化的类是哪一个,也就是说工厂方法模式让实例化推迟到子类。 + * + * 工厂方法模式非常符合“开闭原则”,当需要增加一个新的产品时,我们只需要增加一个具 + * 体的产品类和与之对应的具体工厂即可,无须修改原有系统。同时在工厂方法模式中用户只 + * 需要知道生产产品的具体工厂即可,无须关系产品的创建过程,甚至连具体的产品类名称都 + * 不需要知道。虽然他很好的符合了“开闭原则”,但是由于每新增一个新产品时就需要增加 + * 两个类,这样势必会导致系统的复杂度增加。 + */ } From 15cdc18ed6fe6fcaacdade675cd94c7903a7f096 Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 19:50:30 +0800 Subject: [PATCH 14/51] =?UTF-8?q?add=20>=20=E6=8A=BD=E8=B1=A1=E5=B7=A5?= =?UTF-8?q?=E5=8E=82=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../creational/AbstractFactoryPattern.java | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 design-pattern/src/main/java/creational/AbstractFactoryPattern.java diff --git a/design-pattern/src/main/java/creational/AbstractFactoryPattern.java b/design-pattern/src/main/java/creational/AbstractFactoryPattern.java new file mode 100644 index 0000000..a40d8b9 --- /dev/null +++ b/design-pattern/src/main/java/creational/AbstractFactoryPattern.java @@ -0,0 +1,107 @@ +package creational; + +/** + * Created by 李恒名 on 2017/7/16. + *
+ * 抽象工厂模式,与简单工厂、工厂方法模式的区别在于,前者只有一个产品线只为创建一个 + * 产品服务,而后者则拥有多个产品线。 + */ +public class AbstractFactoryPattern { + //汽车抽象 + static abstract class Car { + abstract void run(); + } + + //SUV产品抽象 + static abstract class Suv extends Car { + } + + //商务轿车产品抽象 + static abstract class Sedan extends Car { + } + + //奔驰SUV + static class BenzSuv extends Suv { + @Override + void run() { + System.out.println("奔驰(SUV)车在跑"); + } + } + + //奔驰轿车 + static class BenzSedan extends Sedan { + @Override + void run() { + System.out.println("奔驰(轿车)车在跑"); + } + } + + //宝马SUV + static class BMWSuv extends Suv { + @Override + void run() { + System.out.println("宝马(SUV)车在跑"); + } + } + + //宝马轿车 + static class BMWSedan extends Sedan { + @Override + void run() { + System.out.println("宝马(轿车)车在跑"); + } + } + + //抽象汽车工厂(拥有两个产品线) + static abstract class CarFactory { + abstract Suv getSuv(); + + abstract Sedan getSedan(); + } + + //奔驰汽车工厂 + static class BenzCarFactory extends CarFactory { + + @Override + Suv getSuv() { + return new BenzSuv(); + } + + @Override + Sedan getSedan() { + return new BenzSedan(); + } + } + + //宝马汽车工厂 + static class BMWCarFactory extends CarFactory { + + @Override + Suv getSuv() { + return new BMWSuv(); + } + + @Override + Sedan getSedan() { + return new BMWSedan(); + } + } + + public static void main(String[] args) { + CarFactory carFactory = new BenzCarFactory(); + //CarFactory carFactory = new BMWCarFactory(); + Sedan sedan = carFactory.getSedan(); + sedan.run(); + Suv suv = carFactory.getSuv(); + suv.run(); + } + + /** + * 总结: + * 所谓抽象工厂模式就是她提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确 + * 指定具体类。他允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出 + * 的具体产品是什么。这样一来,客户就可以从具体的产品中被解耦。它的优点是隔离了具体 + * 类的生成,使得客户端不需要知道什么被创建了,而缺点就在于新增新的行为会比较麻烦, + * 因为当添加一个新的产品对象时,需要更加需要更改接口及其下所有子类。 + */ +} From a4bad116587b9ecb20196ac04850839bed56fba4 Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 19:51:08 +0800 Subject: [PATCH 15/51] =?UTF-8?q?add=20>=20=E5=8E=9F=E5=9E=8B=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/creational/PrototypePattern.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 design-pattern/src/main/java/creational/PrototypePattern.java diff --git a/design-pattern/src/main/java/creational/PrototypePattern.java b/design-pattern/src/main/java/creational/PrototypePattern.java new file mode 100644 index 0000000..33e1fd4 --- /dev/null +++ b/design-pattern/src/main/java/creational/PrototypePattern.java @@ -0,0 +1,47 @@ +package creational; + +/** + * Created by 李恒名 on 2017/7/16. + *
+ * 原型模式,即通过一个实例的原型来复制(克隆)出类似的实例,而不是去重新创建,这有 + * 点像克隆人。如果你使用过 Javascript ,你应该对 Prototype 很熟悉。 + */ +public class PrototypePattern { + + /** + * 简单来说就是通过实现 Cloneable 接口来进行复制,这种复制方式为浅复制。 + * + * @see Cloneable + */ + static class Man implements Cloneable { + private String name = "高富帅"; + + @Override + protected Man clone() throws CloneNotSupportedException { + return (Man) super.clone(); + } + + @Override + public String toString() { + return "Man{" + + "name='" + name + '\'' + + '}'; + } + } + + public static void main(String[] args) throws CloneNotSupportedException { + Man man = new Man(); + System.out.println(man); + System.out.println(man.clone()); + System.out.println(man.clone()); + System.out.println(man.clone()); + } + + /** + * 总结: + * 在开发过程中,有时会遇到为一个类创建多个实例的情况,这些实例内部成员往往完 + * 全相同或有细微的差异,而且实例的创建开销比较大或者需要输入较多参数,如果能通过复 + * 制一个已创建的对象实例来重复创建多个相同的对象,这就可以大大减少创建对象的开销, + * 这个时候就需要原型模式。 + */ +} From b10620d900813c38545372612dc29cd93697b371 Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 19:51:52 +0800 Subject: [PATCH 16/51] =?UTF-8?q?add=20>=20=E9=9D=99=E6=80=81=E5=B7=A5?= =?UTF-8?q?=E5=8E=82=E6=96=B9=E6=B3=95=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StaticFactoryMethodPattern.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 design-pattern/src/main/java/creational/StaticFactoryMethodPattern.java diff --git a/design-pattern/src/main/java/creational/StaticFactoryMethodPattern.java b/design-pattern/src/main/java/creational/StaticFactoryMethodPattern.java new file mode 100644 index 0000000..7045354 --- /dev/null +++ b/design-pattern/src/main/java/creational/StaticFactoryMethodPattern.java @@ -0,0 +1,48 @@ +package creational; + +/** + * Created by 李恒名 on 2017/6/14. + *
+ * 静态工厂方法模式,准确来讲这并不是一种设计模式,只是为了简化创建对象的过程。 + * 这种创建对象形式很常见,比如 Guava 中的 Lists 、Maps 等。 + */ +public class StaticFactoryMethodPattern { + //汽车抽象 + static abstract class Car { + abstract void run(); + } + + //奔驰汽车 + static class Benz extends Car { + @Override + void run() { + System.out.println("奔驰车在跑"); + } + } + + //宝马汽车 + static class BMW extends Car { + @Override + void run() { + System.out.println("宝马车在跑"); + } + } + + //汽车工厂 + static final class CarFactory { + + public static Benz getBeznCar() { + return new Benz(); + } + public static BMW getBMWCar() { + return new BMW(); + } + } + + public static void main(String[] args) { + Car car = CarFactory.getBeznCar(); + //Car car = CarFactory.getBMWCar; + car.run(); + } +} + From 87f7b446546af71cddb9e227d9143f3d04b6d79f Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 19:52:12 +0800 Subject: [PATCH 17/51] =?UTF-8?q?update=20>=20=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3a4b44f..08ee9f0 100644 --- a/README.md +++ b/README.md @@ -20,9 +20,10 @@ - [创建型模式(Creational)](https://github.com/lihengming/java-codes/tree/master/design-pattern/src/main/java/creational) - [简单工厂模式(Simple Factory)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/SimpleFactoryPattern.java) - [工厂方法模式(Factory Method)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/FactoryMethodPattern.java) - - 抽象工厂模式(Abstract Factory) + - [抽象工厂模式(Abstract Factory)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/AbstractFactoryPatternjava) + - [静态工厂方法模式(Static Factory Method)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/StaticFactoryMethodPattern.java) - [创建者模式(Builder)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/BuilderPattern.java) - - 原型模式(Prototype) + - [原型模式(Prototype)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/PrototypePattern.java) - [单例模式(Singleton)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/SingletonPattern.java) - [结构型模式(Structural)](https://github.com/lihengming/java-codes/tree/master/design-pattern/src/main/java/structural) - 外观模式(Facade) From 53c4ffa4f32ed5ae92a240360122e5e6f30f98d9 Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Sun, 16 Jul 2017 19:58:15 +0800 Subject: [PATCH 18/51] =?UTF-8?q?update=20>=20=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 08ee9f0..54524b6 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ - [创建型模式(Creational)](https://github.com/lihengming/java-codes/tree/master/design-pattern/src/main/java/creational) - [简单工厂模式(Simple Factory)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/SimpleFactoryPattern.java) - [工厂方法模式(Factory Method)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/FactoryMethodPattern.java) - - [抽象工厂模式(Abstract Factory)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/AbstractFactoryPatternjava) + - [抽象工厂模式(Abstract Factory)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/AbstractFactoryPattern.java) - [静态工厂方法模式(Static Factory Method)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/StaticFactoryMethodPattern.java) - [创建者模式(Builder)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/BuilderPattern.java) - [原型模式(Prototype)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/PrototypePattern.java) From 63a2fa69c6a79ca23525a1f2a6cdbef249bd6a8c Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Mon, 17 Jul 2017 19:00:12 +0800 Subject: [PATCH 19/51] =?UTF-8?q?add=20>=20=E5=A4=96=E8=A7=82=EF=BC=88?= =?UTF-8?q?=E9=97=A8=E9=9D=A2=EF=BC=89=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../main/java/structural/FacadePattern.java | 59 +++++++++++++++++++ .../main/java/structural/package-info.java | 5 +- 3 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 design-pattern/src/main/java/structural/FacadePattern.java diff --git a/README.md b/README.md index 54524b6..ee3c195 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ - [原型模式(Prototype)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/PrototypePattern.java) - [单例模式(Singleton)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/SingletonPattern.java) - [结构型模式(Structural)](https://github.com/lihengming/java-codes/tree/master/design-pattern/src/main/java/structural) - - 外观模式(Facade) + - [外观(门面)模式(Facade)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/FacadePattern.java) - 适配器模式(Adapter) - 代理模式(Proxy) - 装饰模式(Decorator) diff --git a/design-pattern/src/main/java/structural/FacadePattern.java b/design-pattern/src/main/java/structural/FacadePattern.java new file mode 100644 index 0000000..d7cf70c --- /dev/null +++ b/design-pattern/src/main/java/structural/FacadePattern.java @@ -0,0 +1,59 @@ +package structural; + +/** + * Created by 李恒名 on 2017/7/17. + *
+ * 外观模式,也称门面模式,用于为一个复杂的系统提供一个统一、简单的访问入口 + */ +public class FacadePattern { + + //系统门面,为多复杂子系统提供访问入口 + static class SystemFacade { + void start() { + new SubSystemA().start(); + new SubSystemB().start(); + new SubSystemC().start(); + new SubSystemD().start(); + } + } + + static class SubSystemA { + void start() { + System.out.println("子系统A启动"); + } + } + + static class SubSystemB { + void start() { + System.out.println("子系统B启动"); + } + } + + static class SubSystemC { + void start() { + System.out.println("子系统C启动"); + } + } + + static class SubSystemD { + void start() { + System.out.println("子系统D启动"); + } + } + + public static void main(String[] args) { + SystemFacade facade = new SystemFacade(); + facade.start(); + } + + /** + * 总结: + * 我们都知道类与类之间的耦合越低,那么可复用性就越好,如果两个类不必彼此通信,那么 + * 就不要让这两个类发生直接的相互关系,如果需要调用里面的方法,可以通过第三者来转发 + * 调用。外观模式非常好的诠释了这段话。外观模式提供了一个统一的接口,用来访问子系统 + * 中的一群接口。它让一个应用程序中子系统间的相互依赖关系减少到了最少,它给子系统提 + * 供了一个简单、单一的屏障,客户通过这个屏障来与子系统进行通信。 + * 通过使用外观模式,使得客户对子系统的引用变得简单了,实现了客户与子系统之间的松耦 + * 合,但是它违背了“开闭原则”,因为增加新的子系统可能需要修改外观类或客户端的源代码。 + */ +} diff --git a/design-pattern/src/main/java/structural/package-info.java b/design-pattern/src/main/java/structural/package-info.java index b52a66f..21e0be3 100644 --- a/design-pattern/src/main/java/structural/package-info.java +++ b/design-pattern/src/main/java/structural/package-info.java @@ -1,5 +1,8 @@ /** * 结构型模式 - * + *
+ * 结构型模式主要是用于处理类或者对象的组合,它描述了如何来类或者对象更好的组合起来 + * ,是从程序的结构上来解决模块之间的耦合问题。它主要包括适配器模式、桥接模式、组合 + * 模式、装饰模式、外观模式、享元模式、代理模式这个七个模式。 */ package structural; \ No newline at end of file From 175f445099e25a28c9c2d52fc709b580e0e20808 Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Mon, 17 Jul 2017 19:01:49 +0800 Subject: [PATCH 20/51] =?UTF-8?q?add=20>=20=E5=A4=96=E8=A7=82=EF=BC=88?= =?UTF-8?q?=E9=97=A8=E9=9D=A2=EF=BC=89=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- design-pattern/src/main/java/structural/FacadePattern.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/design-pattern/src/main/java/structural/FacadePattern.java b/design-pattern/src/main/java/structural/FacadePattern.java index d7cf70c..f491855 100644 --- a/design-pattern/src/main/java/structural/FacadePattern.java +++ b/design-pattern/src/main/java/structural/FacadePattern.java @@ -7,7 +7,7 @@ */ public class FacadePattern { - //系统门面,为多复杂子系统提供访问入口 + //系统门面 static class SystemFacade { void start() { new SubSystemA().start(); From 3405887d099b8f1d56ddd4db4edefc3e3436015c Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Mon, 17 Jul 2017 19:03:01 +0800 Subject: [PATCH 21/51] =?UTF-8?q?add=20>=20=E5=A4=96=E8=A7=82=EF=BC=88?= =?UTF-8?q?=E9=97=A8=E9=9D=A2=EF=BC=89=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ee3c195..3bfd90a 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ - [原型模式(Prototype)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/PrototypePattern.java) - [单例模式(Singleton)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/SingletonPattern.java) - [结构型模式(Structural)](https://github.com/lihengming/java-codes/tree/master/design-pattern/src/main/java/structural) - - [外观(门面)模式(Facade)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/creational/FacadePattern.java) + - [外观(门面)模式(Facade)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/structural/FacadePattern.java) - 适配器模式(Adapter) - 代理模式(Proxy) - 装饰模式(Decorator) From 7b96d82a08976310ae7b9a474bb4e74f91c1e174 Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Tue, 18 Jul 2017 19:08:49 +0800 Subject: [PATCH 22/51] =?UTF-8?q?add=20>=20Spring=20Boot=20=E7=AC=94?= =?UTF-8?q?=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Spring Boot \347\254\224\350\256\260.docx" | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename "shared-resources/Spring Boot\347\254\224\350\256\260.docx" => "shared-resources/Spring Boot \347\254\224\350\256\260.docx" (100%) diff --git "a/shared-resources/Spring Boot\347\254\224\350\256\260.docx" "b/shared-resources/Spring Boot \347\254\224\350\256\260.docx" similarity index 100% rename from "shared-resources/Spring Boot\347\254\224\350\256\260.docx" rename to "shared-resources/Spring Boot \347\254\224\350\256\260.docx" From a212cb6eceb42b41ad116df77d2cc1dcc0372de8 Mon Sep 17 00:00:00 2001 From: lihengming <89921218@qq.com> Date: Wed, 19 Jul 2017 19:26:55 +0800 Subject: [PATCH 23/51] =?UTF-8?q?add=20>=20=E4=BB=A3=E7=90=86=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../main/java/structural/ProxyPattern.java | 56 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 design-pattern/src/main/java/structural/ProxyPattern.java diff --git a/README.md b/README.md index 3bfd90a..3f7ef61 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ - [结构型模式(Structural)](https://github.com/lihengming/java-codes/tree/master/design-pattern/src/main/java/structural) - [外观(门面)模式(Facade)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/structural/FacadePattern.java) - 适配器模式(Adapter) - - 代理模式(Proxy) + - [代理模式(Proxy)](https://github.com/lihengming/java-codes/blob/master/design-pattern/src/main/java/structural/ProxyPattern.java) - 装饰模式(Decorator) - 桥模式(Bridge) - 组合模式(Composite) diff --git a/design-pattern/src/main/java/structural/ProxyPattern.java b/design-pattern/src/main/java/structural/ProxyPattern.java new file mode 100644 index 0000000..0a5df3d --- /dev/null +++ b/design-pattern/src/main/java/structural/ProxyPattern.java @@ -0,0 +1,56 @@ +package structural; + +/** + * Created by 李恒名 on 2017/7/19. + *
+ * 代理模式,为目标对象创建一个代理对象,其他对象可以通过代理对象来访问目标对象的方法,AOP、拦截器均为该模式的实践。
+ * @see java.lang.reflect.Proxy JDK动态代理
+ */
+public class ProxyPattern {
+ //唱歌的能力
+ interface Singable {
+ void sing();
+ }
+
+ //歌手
+ static class Singer implements Singable {
+
+ @Override
+ public void sing() {
+ System.out.println("歌手唱歌");
+ }
+ }
+
+ //歌手的代理人
+ static class SingerProxy implements Singable {
+ //歌手
+ private Singable singer;
+
+ public SingerProxy(Singable singer) {
+ this.singer = singer;
+ }
+
+ @Override
+ public void sing() {
+ System.out.println("代理人承接演出");
+ System.out.println("代理人布置演出场地");
+ singer.sing();
+ System.out.println("代理人结算演出费用");
+ }
+ }
+
+ public static void main(String[] args) {
+ Singer singer = new Singer();
+ SingerProxy proxy = new SingerProxy(singer);
+ proxy.sing();
+ }
+
+ /**
+ * 总结:
+ * 代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。它使得客户不
+ * 能直接与真正的目标对象通信。代理对象是目标对象的代表,其他需要与这个目标对象打交
+ * 道的操作都是和这个代理对象在交涉。代理对象可以在客户端和目标对象之间起到中介的作
+ * 用,这样起到了的作用和保护了目标对象的,同时也在一定程度上面减少了系统的耦合度。
+ */
+
+}
From fce2020c83c890f358c2d1e6b5eeb4195d767463 Mon Sep 17 00:00:00 2001
From: lihengming <89921218@qq.com>
Date: Fri, 21 Jul 2017 12:11:48 +0800
Subject: [PATCH 24/51] add > image for spring-boot-api-project-seed issue #31
---
.../github-images/issue-31/step1.png | Bin 0 -> 40833 bytes
.../github-images/issue-31/step2.png | Bin 0 -> 47350 bytes
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 shared-resources/github-images/issue-31/step1.png
create mode 100644 shared-resources/github-images/issue-31/step2.png
diff --git a/shared-resources/github-images/issue-31/step1.png b/shared-resources/github-images/issue-31/step1.png
new file mode 100644
index 0000000000000000000000000000000000000000..a68bef492d4d0de06045a040e4b81a69432480f4
GIT binary patch
literal 40833
zcmd42cT`hd_bv)3DgvTJK&6UeRJw%@Q9)^vh=tw}1*xI8BnU_mX`<8siWH?Iy#}e$
zQA+5cNGPF)5YpfTeBbZ;jWf=@ 5%r5)gMfBo4v4k5E0uW r=1gc#r@Tr9q7K5!6
z5$ZOO33j9aG`PsprtG!g+Wnl;7Y`xLM?bFWY38r}==vTp8}}2jm9s|uVmWESe$lR_8y}xbtM@=7>J+uhXAZ<8Lu$6f%S4g5E!k5%0pb7pesZ%7}l1W~E(^am*U)
z_ZYTMPMiA;Wgog3Z-_pAxGr6-$){X$xPYz)Q-}b>9a~P*T<&}eICDlgMFPe2`#q1c
zD_q{8@l_B+&_!U>mdQy3Y>*k&&-w_!2wl}bp8V~TTTu&(_GC8K)mP6ynQjpnm3w7O
z-^qe@=-o9tX8Ave0K8heSL3Qm_%KUeSYGRsJsddy)N8rVN4D)+!%Z4N_E4*tG^FkQ
zuwu+L=)K=Vyn;jnkd7$$7NaBY^jN?X)?+%wuPC{w8?o$RHmMXbu=iNe$r0(d@b
a>DTBdW
z61gaZ&7PbvnD3^ndKz+LsUdA7j%zH(u}?WmcVUwHh*0CB&^!-3diJ096Oq*s0JE4X
z(r0oJ59h?dSv@hA*+xrzc$nN7%Js0lT=j>IVKDy7)RUT*z{u|qccitGUtJ++Sm2)y
z9=6kQwB8B1_KBTG;`erefXB0H8=0zqG()~x%-~-AMn;pbYdl28GzE(g3IE0kiSJs^
z00k-$xJDG$@qB|Al2PbBMtKD-SyMwcpNq)|ByQR$NkfJ8qaXgYt_%SkhM$T&{J(SY
zE(5tQyw33Py-1i#c>PrfE_iQXc+S5GDC|qPe3b29)DtjT`Un(uz6+n(68=6%`0{@=
zCZhFT7(nDMLJL_8G4|H|A)pw0m!v@*;Ck#`yjq(h`kw%1C-u!~px9Oiv!BEL;FS6O
z;xlJ}b^WI)>2ge)KRyy5`oV<3z-Dt)W5R0BfkMU-pl&~Z4~`25
zpCDZhxxc2}{=TN&mP%<$eX^{gkViC~0{UYX3QgbBszRea|CwTDz*{mR+=T0@Afn(u
z%W+Gk+`#N=&8)AIEtBk;W_1)ejkRLD`_$1lX=cVc0lLoLZ!N#b^0$`l &;EUMF>UWt0@~nt>JnHc<1oF_*i(_bL9*U
z5t?1s{IHdpax&de71QNks(1|B`hW}-u{XLW6J~xI+Qhm2@+9KH)}=9KVYuBM|I0i*X0{c(F!vgUGV$kY5Quha7Qh%0ynd4@gxl6^M?-gaed+o*
z*zg_GQJp(h_pJOPjlp8SWamxMJ_P?ePcRD0VOd1lGW&jA2%LX{T!IK@IhR2*(!$^7
zxCS0U3;1pNFMbZSh_0TYz7p?6T}**5@WQiU(fi$`g_LwdMa;y;ykw{k2!G7&<;R_Q
zNsL9Wv%kH9c~`=^zv?r14-%o8swcSr&Zjwbt4ab-Z(ujIaWmB!gsBkeR6v*}tgChtP-5`93;`rQzffX!b1}m)_Dzfq=F(DhCF0lZ!ose$uSH11|E6RMlrqHFq
z+R+GOAvTND%xeDgG;S%z&R5m&`gIKnQavb&6CbI2ygKy_qm#l{BBRSoj}07-kiK0>
zsGh63I=uz^WWxL_wH3ELOekmh!%Ojf)_xfRuA+X5l-ecAWW#~i%k;9w1$*Cx(GPQy
z%E
tDa*UUST9?STnxp!_=)6|Dj_XzsIubo;BOgE$#df
zHrZc6I7NDD>&!W$Y$2iG?Qn6&FyO%
~
zw?R%{FHh;;#mFE@faj3%!60{eljW{}6-6`|rL4d<`&APgBPIo*9s5_mbjO*p~>z
z^L&g=Yq-iU+