From b41961fb2e22c177e6be0a9610171eac90e7054f Mon Sep 17 00:00:00 2001
From: limingyang <461284063@qq.com>
Date: Tue, 20 Aug 2019 14:29:02 +0800
Subject: [PATCH 01/47] =?UTF-8?q?=E5=8A=A0=E5=85=A5ignore?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
create mode 100644 .gitignore
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..dc0697d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+# Eclipse
+.classpath
+.project
+.settings/
+
+# Intellij
+.idea/
+*.iml
+*.iws
+
+# Mac
+.DS_Store
+
+# SVN
+.svn/
+
+# Maven
+log/
+target/
+
+# Syswin
+disconf/
+logs/
+/NewInnerAPI/
From 99b6aa0de12d5f6b8f66a5589ecad9b7ee15abe3 Mon Sep 17 00:00:00 2001
From: youlookwhat <770413277@qq.com>
Date: Wed, 25 Sep 2019 22:00:21 +0800
Subject: [PATCH 02/47] update README.md
---
DesignPattern.iml | 19 -------------------
README.md | 8 ++++----
2 files changed, 4 insertions(+), 23 deletions(-)
delete mode 100644 DesignPattern.iml
diff --git a/DesignPattern.iml b/DesignPattern.iml
deleted file mode 100644
index bb5b383..0000000
--- a/DesignPattern.iml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/README.md b/README.md
index d9d964d..ffcc4e1 100644
--- a/README.md
+++ b/README.md
@@ -69,7 +69,7 @@
- 专题接口:[Subject.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/observer/interfaces/Subject.java) ;
- ```java
+ ```java
/**
* 注册一个观察者
*/
@@ -84,7 +84,7 @@
* 通知所有观察者
*/
public void notifyObservers();
- ```
+ ```
- 3D服务号的实现类:[ObjectFor3D.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/observer/classs/ObjectFor3D.java)
@@ -117,7 +117,7 @@
- 所有观察者需要实现此接口:[Observer.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/observer/interfaces/Observer.java)
- ```java
+ ```java
public ObserverUser1(Subject subject) {
subject.registerObserver(this);
}
@@ -125,7 +125,7 @@
public void update(String msg) {
Log.e("-----ObserverUser1 ", "得到 3D 号码:" + msg + ", 我要记下来。 ");
}
- ```
+ ```
- 最后测试:[ObserverActivity.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/observer/ObserverActivity.java)
From d6ae88a490257585c92eb869297cce4df9b40bbb Mon Sep 17 00:00:00 2001
From: youlookwhat <770413277@qq.com>
Date: Wed, 25 Sep 2019 22:02:13 +0800
Subject: [PATCH 03/47] update README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index ffcc4e1..9a55514 100644
--- a/README.md
+++ b/README.md
@@ -118,12 +118,12 @@
- 所有观察者需要实现此接口:[Observer.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/observer/interfaces/Observer.java)
```java
- public ObserverUser1(Subject subject) {
+ public ObserverUser1(Subject subject) {
subject.registerObserver(this);
}
@Override
public void update(String msg) {
- Log.e("-----ObserverUser1 ", "得到 3D 号码:" + msg + ", 我要记下来。 ");
+ Log.e("-----ObserverUser1 ", "得到 3D 号码:" + msg + ", 我要记下来。");
}
```
From 3b2d0abae9abf08645291fbc818682ca9906d28d Mon Sep 17 00:00:00 2001
From: youlookwhat <770413277@qq.com>
Date: Wed, 25 Sep 2019 22:54:48 +0800
Subject: [PATCH 04/47] build gradle to 3.4.2
---
app/build.gradle | 21 +++++++++++----------
build.gradle | 8 ++++++--
gradle/wrapper/gradle-wrapper.properties | 2 +-
3 files changed, 18 insertions(+), 13 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index eb475a9..83ca775 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,11 +1,12 @@
apply plugin: 'com.android.application'
+
android {
- compileSdkVersion 24
- buildToolsVersion "24.0.2"
+ compileSdkVersion 28
+ buildToolsVersion "28.0.3"
defaultConfig {
applicationId "com.example.jingbin.designpattern"
minSdkVersion 19
- targetSdkVersion 24
+ targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
@@ -17,15 +18,15 @@ android {
}
}
}
-apply plugin: 'com.neenbedankt.android-apt'//增加这一句
+
dependencies {
- androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
+ androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
- compile 'com.android.support:appcompat-v7:24.2.1'
- testCompile 'junit:junit:4.12'
- compile fileTree(include: ['*.jar'], dir: 'libs')
+ implementation 'com.android.support:appcompat-v7:28.0.0'
+ testImplementation 'junit:junit:4.12'
+ implementation fileTree(include: ['*.jar'], dir: 'libs')
//增加这二句
- compile 'com.jakewharton:butterknife:8.4.0'
- apt 'com.jakewharton:butterknife-compiler:8.4.0'
+ implementation 'com.jakewharton:butterknife:8.8.1'
+ annotationProcessor "com.jakewharton:butterknife-compiler:8.8.1"
}
diff --git a/build.gradle b/build.gradle
index 24750a2..2d8b70f 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,11 +2,13 @@
buildscript {
repositories {
+ google()
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.2.0'
- classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //增加这一句
+ classpath 'com.android.tools.build:gradle:3.4.2'
+ classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'//Added line
+ classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0-rc2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
@@ -14,6 +16,8 @@ buildscript {
allprojects {
repositories {
+ mavenCentral()
+ google()
jcenter()
}
}
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 04e285f..3e94244 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
From 300e537a971a9b013e4a23c72dcdeabcf31a304a Mon Sep 17 00:00:00 2001
From: youlookwhat <770413277@qq.com>
Date: Fri, 31 Jan 2020 16:31:43 +0800
Subject: [PATCH 05/47] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E5=BB=BA=E9=80=A0?=
=?UTF-8?q?=E8=80=85=E6=A8=A1=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 17 +++--
app/build.gradle | 5 ++
app/src/main/AndroidManifest.xml | 7 ++-
.../jingbin/designpattern/MainActivity.java | 7 +++
.../designpattern/app/AppConstant.java | 1 +
.../designpattern/app/PatternApplication.java | 9 ---
.../designpattern/builder/Builder.java | 12 ++++
.../builder/BuilderActivity.java | 62 +++++++++++++++++++
.../builder/ConcreteBuilder.java | 21 +++++++
.../designpattern/builder/Director.java | 20 ++++++
.../designpattern/builder/Product.java | 26 ++++++++
app/src/main/res/layout/activity_builder.xml | 59 ++++++++++++++++++
app/src/main/res/layout/activity_main.xml | 25 +++++++-
13 files changed, 255 insertions(+), 16 deletions(-)
create mode 100644 app/src/main/java/com/example/jingbin/designpattern/builder/Builder.java
create mode 100644 app/src/main/java/com/example/jingbin/designpattern/builder/BuilderActivity.java
create mode 100644 app/src/main/java/com/example/jingbin/designpattern/builder/ConcreteBuilder.java
create mode 100644 app/src/main/java/com/example/jingbin/designpattern/builder/Director.java
create mode 100644 app/src/main/java/com/example/jingbin/designpattern/builder/Product.java
create mode 100644 app/src/main/res/layout/activity_builder.xml
diff --git a/README.md b/README.md
index 9a55514..5eae9c5 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,17 @@
# DesignPattern
-> 参照Hongyang的CSDN博客所写。如有错误欢迎指正,如有侵权,请联系我删除。
-#### Java 设计模式(观察者模式、工厂模式、单例模式、策略模式、命令模式、装饰者模式、外观模式、模板方法模式、状态模式)
+#### Java 设计模式(观察者模式、工厂模式、单例模式、策略模式、命令模式、装饰者模式、外观模式、模板方法模式、状态模式、建造者模式)
-> 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
+设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
设计模式分为三种类型,共23种:
- - **创建型模式**:[单例模式](https://github.com/youlookwhat/DesignPattern#3-单例设计模式)、抽象工厂模式、建造者模式、[工厂模式](https://github.com/youlookwhat/DesignPattern#2-工厂模式)、原型模式。
+ - **创建型模式**:[单例模式](https://github.com/youlookwhat/DesignPattern#3-单例设计模式)、[抽象工厂模式](https://github.com/youlookwhat/DesignPattern#2-工厂模式)、建造者模式、[工厂模式](https://github.com/youlookwhat/DesignPattern#2-工厂模式)、原型模式。
- **结构型模式**:[适配器模式](https://github.com/youlookwhat/DesignPattern#5-适配器模式)、桥接模式、[装饰模式](https://github.com/youlookwhat/DesignPattern#7-装饰者模式)、组合模式、[外观模式](https://github.com/youlookwhat/DesignPattern#8-外观模式)、享元模式、代理模式。
- **行为型模式**:[模版方法模式](https://github.com/youlookwhat/DesignPattern#9-模板方法模式)、[命令模式](https://github.com/youlookwhat/DesignPattern#6-命令模式)、迭代器模式、[观察者模式](https://github.com/youlookwhat/DesignPattern#1-观察者模式)、中介者模式、备忘录模式、解释器模式、[状态模式](https://github.com/youlookwhat/DesignPattern#10-状态模式)、[策略模式](https://github.com/youlookwhat/DesignPattern#4-策略模式)、职责链模式(责任链模式)、访问者模式。
+> 参照Hongyang的CSDN博客所写。如有错误欢迎指正,如有侵权,请联系我删除。
+
----
@@ -35,6 +36,8 @@
- 9.[ 设计模式 模版方法模式(Template Method Pattern) 展现程序员的一天](http://blog.csdn.net/lmj623565791/article/details/26276093)
- 10.[ 设计模式 状态模式(State Pattern) 以自动售货机为例](http://blog.csdn.net/lmj623565791/article/details/26350617)
+
+ - 11.[ 设计模式 建造者模式(Builder Pattern) 以造汽车买汽车为例](https://wiki.jikexueyuan.com/project/java-design-pattern/builder-pattern.html)
## Source Code
@@ -48,6 +51,7 @@
> - 8. [Facade](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/facade)
> - 9. [Template Method](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/templatemethod)
> - 10. [State](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/state)
+> - 11. [Builder](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/builder)
## Project Picture
@@ -470,6 +474,11 @@
machineBetter.turnCrank();
```
+
+### 11. 建造者模式
+> 建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
+
+
## Download
- [DesignPattern.apk](http://download.csdn.net/detail/jingbin_/9684545)
diff --git a/app/build.gradle b/app/build.gradle
index 83ca775..e49d44c 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -17,6 +17,11 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
+
+ // databinding
+ dataBinding {
+ enabled = true
+ }
}
dependencies {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d3938c7..386ec0a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,5 +1,6 @@
+ android:theme="@style/AppTheme"
+ tools:ignore="GoogleAppIndexingWarning">
@@ -46,6 +48,9 @@
+
\ No newline at end of file
diff --git a/app/src/main/java/com/example/jingbin/designpattern/MainActivity.java b/app/src/main/java/com/example/jingbin/designpattern/MainActivity.java
index fa58191..12a18a7 100644
--- a/app/src/main/java/com/example/jingbin/designpattern/MainActivity.java
+++ b/app/src/main/java/com/example/jingbin/designpattern/MainActivity.java
@@ -7,6 +7,7 @@
import android.widget.Button;
import com.example.jingbin.designpattern.adapter.AdapterActivity;
+import com.example.jingbin.designpattern.builder.BuilderActivity;
import com.example.jingbin.designpattern.command.CommandActivity;
import com.example.jingbin.designpattern.decorator.DecoratorActivity;
import com.example.jingbin.designpattern.facade.FacadeActivity;
@@ -45,6 +46,8 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
Button btTemplateMethod;
@BindView(R.id.bt_state)
Button btState;
+ @BindView(R.id.bt_builder)
+ Button btBuilder;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -65,6 +68,7 @@ private void initListener() {
btFacade.setOnClickListener(this);
btTemplateMethod.setOnClickListener(this);
btState.setOnClickListener(this);
+ btBuilder.setOnClickListener(this);
}
@Override
@@ -100,6 +104,9 @@ public void onClick(View v) {
case R.id.bt_state:// 状态模式
startActivity(new Intent(this, StateActivity.class));
break;
+ case R.id.bt_builder:// 建造者模式
+ startActivity(new Intent(this, BuilderActivity.class));
+ break;
default:
break;
}
diff --git a/app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java b/app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java
index be3592a..6ac7a7c 100644
--- a/app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java
+++ b/app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java
@@ -14,6 +14,7 @@ public class AppConstant {
public final static String DECORATOR_DEFINE = "装饰者模式(Decorator Pattern)定义:若要扩展功能,装饰者提供了比集成更有弹性的替代方案,动态地将责任附加到对象上。(先简单描述下装饰者模式发挥作用的地方,当我们设计好了一个类,我们需要给这个类添加一些辅助的功能,并且不希望改变这个类的代码,这时候就是装饰者模式大展雄威的时候了。这里还体现了一个原则:类应该对扩展开放,对修改关闭。))";
public final static String FACADE_DEFINE = "外观模式(Facade Pattern)定义:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用。其实就是为了方便客户的使用,把一群操作,封装成一个方法。)";
public final static String TEMPLATEMETHOD_DEFINE = "模板方法模式(Template Method Pattern)定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。(模版方法定义了一个算法的步骤,并且允许子类为一个或多个步骤提供实现。)";
+ public final static String BUILDER_DEFINE = "建造者模式(Builder Pattern)建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。";
public final static String JDGC_FACTORY_DEFINE = "简单工厂模式定义:通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。";
public final static String GCFF_FACTORY_DEFINE = "工厂方法模式定义:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式把类实例化的过程推迟到子类。";
public final static String CXGC_FACTORY_DEFINE = "抽象工厂模式定义:提供一个接口,用于创建相关的或依赖对象的家族,而不需要明确指定具体类。";
diff --git a/app/src/main/java/com/example/jingbin/designpattern/app/PatternApplication.java b/app/src/main/java/com/example/jingbin/designpattern/app/PatternApplication.java
index 8b99c02..cf13c8d 100644
--- a/app/src/main/java/com/example/jingbin/designpattern/app/PatternApplication.java
+++ b/app/src/main/java/com/example/jingbin/designpattern/app/PatternApplication.java
@@ -2,8 +2,6 @@
import android.app.Application;
-import com.example.jingbin.designpattern.singleton.lanhan.SingletonLanHan;
-
/**
* Created by jingbin on 2016/10/22.
*/
@@ -13,13 +11,6 @@ public class PatternApplication extends Application {
private static PatternApplication patternApplication;
public static PatternApplication getInstance() {
- if (patternApplication == null) {
- synchronized (PatternApplication.class) {
- if (patternApplication == null) {
- patternApplication = new PatternApplication();
- }
- }
- }
return patternApplication;
}
diff --git a/app/src/main/java/com/example/jingbin/designpattern/builder/Builder.java b/app/src/main/java/com/example/jingbin/designpattern/builder/Builder.java
new file mode 100644
index 0000000..8f14b0f
--- /dev/null
+++ b/app/src/main/java/com/example/jingbin/designpattern/builder/Builder.java
@@ -0,0 +1,12 @@
+package com.example.jingbin.designpattern.builder;
+
+/**
+ * Created by jingbin on 2020-01-31.
+ * 抽象建造者
+ */
+public abstract class Builder {
+
+ public abstract void setPart(String name, String type);
+
+ public abstract Product getProduct();
+}
diff --git a/app/src/main/java/com/example/jingbin/designpattern/builder/BuilderActivity.java b/app/src/main/java/com/example/jingbin/designpattern/builder/BuilderActivity.java
new file mode 100644
index 0000000..0496ecc
--- /dev/null
+++ b/app/src/main/java/com/example/jingbin/designpattern/builder/BuilderActivity.java
@@ -0,0 +1,62 @@
+package com.example.jingbin.designpattern.builder;
+
+import android.databinding.DataBindingUtil;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+
+import com.example.jingbin.designpattern.R;
+import com.example.jingbin.designpattern.app.AppConstant;
+import com.example.jingbin.designpattern.app.EMTagHandler;
+import com.example.jingbin.designpattern.databinding.ActivityBuilderBinding;
+
+import butterknife.ButterKnife;
+
+/**
+ * @author jingbin
+ * 建造者模式(Builder Pattern)
+ * 建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,
+ * 从而可以使一个建造过程生成具有不同的内部表象的产品对象。
+ *
+ * Builder 类是关键,然后定义一个Builder实现类,再之后就是处理实现类的逻辑。
+ *
+ * 优点:
+ * 1. 首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,
+ * 一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。
+ * 2. 其次,建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,
+ * 基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。
+ * 总结:
+ * 建造者模式与工厂模式类似,他们都是建造者模式,适用的场景也很相似。
+ * 一般来说,如果产品的建造很复杂,那么请用工厂模式;如果产品的建造更复杂,那么请用建造者模式。
+ */
+public class BuilderActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ActivityBuilderBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_builder);
+ ButterKnife.bind(this);
+ setTitle("建造者模式");
+
+ binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.BUILDER_DEFINE));
+
+ binding.btBuyAodi.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Director director = new Director();
+ Product product = director.getAProduct();
+ product.showProduct();
+ }
+ });
+
+ binding.btBuyBaoma.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Director director = new Director();
+ Product product = director.getBProduct();
+ product.showProduct();
+ }
+ });
+ }
+
+}
diff --git a/app/src/main/java/com/example/jingbin/designpattern/builder/ConcreteBuilder.java b/app/src/main/java/com/example/jingbin/designpattern/builder/ConcreteBuilder.java
new file mode 100644
index 0000000..9d0396b
--- /dev/null
+++ b/app/src/main/java/com/example/jingbin/designpattern/builder/ConcreteBuilder.java
@@ -0,0 +1,21 @@
+package com.example.jingbin.designpattern.builder;
+
+/**
+ * Created by jingbin on 2020-01-31.
+ * 具体建造者
+ */
+public class ConcreteBuilder extends Builder {
+
+ private Product product = new Product();
+
+ @Override
+ public void setPart(String name, String type) {
+ product.setName(name);
+ product.setType(type);
+ }
+
+ @Override
+ public Product getProduct() {
+ return product;
+ }
+}
diff --git a/app/src/main/java/com/example/jingbin/designpattern/builder/Director.java b/app/src/main/java/com/example/jingbin/designpattern/builder/Director.java
new file mode 100644
index 0000000..d3cc2ff
--- /dev/null
+++ b/app/src/main/java/com/example/jingbin/designpattern/builder/Director.java
@@ -0,0 +1,20 @@
+package com.example.jingbin.designpattern.builder;
+
+/**
+ * Created by jingbin on 2020-01-31.
+ * 导演类
+ */
+public class Director {
+
+ private Builder builder = new ConcreteBuilder();
+
+ public Product getAProduct() {
+ builder.setPart("奥迪汽车", "Q5");
+ return builder.getProduct();
+ }
+
+ public Product getBProduct() {
+ builder.setPart("宝马汽车", "X7");
+ return builder.getProduct();
+ }
+}
diff --git a/app/src/main/java/com/example/jingbin/designpattern/builder/Product.java b/app/src/main/java/com/example/jingbin/designpattern/builder/Product.java
new file mode 100644
index 0000000..f715383
--- /dev/null
+++ b/app/src/main/java/com/example/jingbin/designpattern/builder/Product.java
@@ -0,0 +1,26 @@
+package com.example.jingbin.designpattern.builder;
+
+import android.util.Log;
+
+/**
+ * Created by jingbin on 2020-01-31.
+ * 产品类
+ */
+public class Product {
+
+ private String name;
+ private String type;
+
+ public void showProduct() {
+ Log.e("---", "名称:" + name);
+ Log.e("---", "型号:" + type);
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+}
diff --git a/app/src/main/res/layout/activity_builder.xml b/app/src/main/res/layout/activity_builder.xml
new file mode 100644
index 0000000..cf56b32
--- /dev/null
+++ b/app/src/main/res/layout/activity_builder.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 72403d4..e9cd7aa 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -4,10 +4,10 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
- android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.jingbin.designpattern.MainActivity">
+
+
+
+
+
+
+
+
From c2e7975870bd3589065274c89c179cebf31a4db2 Mon Sep 17 00:00:00 2001
From: youlookwhat <770413277@qq.com>
Date: Fri, 31 Jan 2020 16:48:03 +0800
Subject: [PATCH 06/47] update README.md
---
README.md | 46 +++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 45 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 5eae9c5..5211c79 100644
--- a/README.md
+++ b/README.md
@@ -240,7 +240,7 @@
return singletonLanHanFour;
}
-```
+ ```
- 内部类[推荐用]:[SingletonIn.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/singleton/inclass/SingletonIn.java)
- 枚举[推荐用]:[SingletonEnum.java](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/singleton/enums/SingletonEnum.java)
@@ -478,6 +478,50 @@
### 11. 建造者模式
> 建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。
+ - 需求:用户去汽车店购买汽车。
+ - 分析:汽车店根据每个用户的需求提取对应汽车
+ - 建造者超类:[Builder](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/builder/Builder.java)
+
+ ```java
+ public abstract class Builder {
+
+ public abstract void setPart(String name, String type);
+
+ public abstract Product getProduct();
+ }
+ ```
+
+- 建造者对应实现类:[ConcreteBuilder](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/builder/ConcreteBuilder.java)
+
+ ```java
+ public class ConcreteBuilder extends Builder {
+
+ private Product product = new Product();
+
+ @Override
+ public void setPart(String name, String type) {
+ product.setName(name);
+ product.setType(type);
+ }
+
+ @Override
+ public Product getProduct() {
+ return product;
+ }
+ }
+ ```
+
+- 店长[Director](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/builder/Director.java)取汽车:
+
+ ```java
+ // 店长
+ Director director = new Director();
+ // 得到宝马汽车,内部实现提取宝马汽车的详情操作
+ Product product = director.getBProduct();
+ // 展示汽车信息
+ product.showProduct();
+ ```
+
## Download
- [DesignPattern.apk](http://download.csdn.net/detail/jingbin_/9684545)
From 8958a017b9ac1dbe4a18d7fb4d0a592c9a6a9957 Mon Sep 17 00:00:00 2001
From: youlookwhat <770413277@qq.com>
Date: Fri, 31 Jan 2020 16:50:05 +0800
Subject: [PATCH 07/47] update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 5211c79..90e74c4 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
设计模式分为三种类型,共23种:
- - **创建型模式**:[单例模式](https://github.com/youlookwhat/DesignPattern#3-单例设计模式)、[抽象工厂模式](https://github.com/youlookwhat/DesignPattern#2-工厂模式)、建造者模式、[工厂模式](https://github.com/youlookwhat/DesignPattern#2-工厂模式)、原型模式。
+ - **创建型模式**:[单例模式](https://github.com/youlookwhat/DesignPattern#3-单例设计模式)、[抽象工厂模式](https://github.com/youlookwhat/DesignPattern#2-工厂模式)、[建造者模式](https://github.com/youlookwhat/DesignPattern#11-建造者模式)、[工厂模式](https://github.com/youlookwhat/DesignPattern#2-工厂模式)、原型模式。
- **结构型模式**:[适配器模式](https://github.com/youlookwhat/DesignPattern#5-适配器模式)、桥接模式、[装饰模式](https://github.com/youlookwhat/DesignPattern#7-装饰者模式)、组合模式、[外观模式](https://github.com/youlookwhat/DesignPattern#8-外观模式)、享元模式、代理模式。
- **行为型模式**:[模版方法模式](https://github.com/youlookwhat/DesignPattern#9-模板方法模式)、[命令模式](https://github.com/youlookwhat/DesignPattern#6-命令模式)、迭代器模式、[观察者模式](https://github.com/youlookwhat/DesignPattern#1-观察者模式)、中介者模式、备忘录模式、解释器模式、[状态模式](https://github.com/youlookwhat/DesignPattern#10-状态模式)、[策略模式](https://github.com/youlookwhat/DesignPattern#4-策略模式)、职责链模式(责任链模式)、访问者模式。
From a89fba9336062e7ff7f39edb01040033515d7403 Mon Sep 17 00:00:00 2001
From: youlookwhat <770413277@qq.com>
Date: Fri, 31 Jan 2020 21:40:59 +0800
Subject: [PATCH 08/47] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E5=8E=9F=E5=9E=8B?=
=?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 | 9 +++
app/src/main/AndroidManifest.xml | 1 +
.../jingbin/designpattern/MainActivity.java | 7 ++
.../designpattern/app/AppConstant.java | 1 +
.../builder/BuilderActivity.java | 3 -
.../prototype/PrototypeActivity.java | 64 +++++++++++++++++++
.../designpattern/prototype/Shape.java | 34 ++++++++++
.../designpattern/prototype/ShapeCache.java | 38 +++++++++++
.../prototype/shapeimpl/Circle.java | 23 +++++++
.../prototype/shapeimpl/Rectangle.java | 23 +++++++
.../prototype/shapeimpl/Square.java | 23 +++++++
app/src/main/res/layout/activity_main.xml | 4 +-
.../main/res/layout/activity_prototype.xml | 64 +++++++++++++++++++
13 files changed, 289 insertions(+), 5 deletions(-)
create mode 100644 app/src/main/java/com/example/jingbin/designpattern/prototype/PrototypeActivity.java
create mode 100644 app/src/main/java/com/example/jingbin/designpattern/prototype/Shape.java
create mode 100644 app/src/main/java/com/example/jingbin/designpattern/prototype/ShapeCache.java
create mode 100644 app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Circle.java
create mode 100644 app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Rectangle.java
create mode 100644 app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Square.java
create mode 100644 app/src/main/res/layout/activity_prototype.xml
diff --git a/README.md b/README.md
index 90e74c4..074b0a4 100644
--- a/README.md
+++ b/README.md
@@ -39,6 +39,7 @@
- 11.[ 设计模式 建造者模式(Builder Pattern) 以造汽车买汽车为例](https://wiki.jikexueyuan.com/project/java-design-pattern/builder-pattern.html)
+ - 12.[ 设计模式 原型模式(Prototype Pattern) 以获取多种形状为例](https://www.runoob.com/design-pattern/prototype-pattern.html)
## Source Code
> - 1. [Observer](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/observer)
@@ -52,6 +53,7 @@
> - 9. [Template Method](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/templatemethod)
> - 10. [State](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/state)
> - 11. [Builder](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/builder)
+> - 12. [Prototype](https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/prototype)
## Project Picture
@@ -522,6 +524,13 @@
product.showProduct();
```
+### 12. 原型模式
+> 原型模式是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
+
+这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
+
+
+
## Download
- [DesignPattern.apk](http://download.csdn.net/detail/jingbin_/9684545)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 386ec0a..7cc302c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -11,6 +11,7 @@
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
+
diff --git a/app/src/main/java/com/example/jingbin/designpattern/MainActivity.java b/app/src/main/java/com/example/jingbin/designpattern/MainActivity.java
index 12a18a7..a1cdda6 100644
--- a/app/src/main/java/com/example/jingbin/designpattern/MainActivity.java
+++ b/app/src/main/java/com/example/jingbin/designpattern/MainActivity.java
@@ -13,6 +13,7 @@
import com.example.jingbin.designpattern.facade.FacadeActivity;
import com.example.jingbin.designpattern.factory.FactoryActivity;
import com.example.jingbin.designpattern.observer.ObserverActivity;
+import com.example.jingbin.designpattern.prototype.PrototypeActivity;
import com.example.jingbin.designpattern.singleton.SingletonActivity;
import com.example.jingbin.designpattern.state.StateActivity;
import com.example.jingbin.designpattern.strategy.StrategyActivity;
@@ -48,6 +49,8 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
Button btState;
@BindView(R.id.bt_builder)
Button btBuilder;
+ @BindView(R.id.bt_prototype)
+ Button btPrototype;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -69,6 +72,7 @@ private void initListener() {
btTemplateMethod.setOnClickListener(this);
btState.setOnClickListener(this);
btBuilder.setOnClickListener(this);
+ btPrototype.setOnClickListener(this);
}
@Override
@@ -107,6 +111,9 @@ public void onClick(View v) {
case R.id.bt_builder:// 建造者模式
startActivity(new Intent(this, BuilderActivity.class));
break;
+ case R.id.bt_prototype:// 原型模式
+ startActivity(new Intent(this, PrototypeActivity.class));
+ break;
default:
break;
}
diff --git a/app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java b/app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java
index 6ac7a7c..3a64b7a 100644
--- a/app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java
+++ b/app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java
@@ -15,6 +15,7 @@ public class AppConstant {
public final static String FACADE_DEFINE = "外观模式(Facade Pattern)定义:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用。其实就是为了方便客户的使用,把一群操作,封装成一个方法。)";
public final static String TEMPLATEMETHOD_DEFINE = "模板方法模式(Template Method Pattern)定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。(模版方法定义了一个算法的步骤,并且允许子类为一个或多个步骤提供实现。)";
public final static String BUILDER_DEFINE = "建造者模式(Builder Pattern)建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。";
+ public final static String PROTOTYPE_DEFINE = "原型模式(Prototype Pattern)定义:是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。";
public final static String JDGC_FACTORY_DEFINE = "简单工厂模式定义:通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。";
public final static String GCFF_FACTORY_DEFINE = "工厂方法模式定义:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式把类实例化的过程推迟到子类。";
public final static String CXGC_FACTORY_DEFINE = "抽象工厂模式定义:提供一个接口,用于创建相关的或依赖对象的家族,而不需要明确指定具体类。";
diff --git a/app/src/main/java/com/example/jingbin/designpattern/builder/BuilderActivity.java b/app/src/main/java/com/example/jingbin/designpattern/builder/BuilderActivity.java
index 0496ecc..a8132fa 100644
--- a/app/src/main/java/com/example/jingbin/designpattern/builder/BuilderActivity.java
+++ b/app/src/main/java/com/example/jingbin/designpattern/builder/BuilderActivity.java
@@ -10,8 +10,6 @@
import com.example.jingbin.designpattern.app.EMTagHandler;
import com.example.jingbin.designpattern.databinding.ActivityBuilderBinding;
-import butterknife.ButterKnife;
-
/**
* @author jingbin
* 建造者模式(Builder Pattern)
@@ -35,7 +33,6 @@ public class BuilderActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityBuilderBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_builder);
- ButterKnife.bind(this);
setTitle("建造者模式");
binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.BUILDER_DEFINE));
diff --git a/app/src/main/java/com/example/jingbin/designpattern/prototype/PrototypeActivity.java b/app/src/main/java/com/example/jingbin/designpattern/prototype/PrototypeActivity.java
new file mode 100644
index 0000000..81d74b4
--- /dev/null
+++ b/app/src/main/java/com/example/jingbin/designpattern/prototype/PrototypeActivity.java
@@ -0,0 +1,64 @@
+package com.example.jingbin.designpattern.prototype;
+
+import android.databinding.DataBindingUtil;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.view.View;
+
+import com.example.jingbin.designpattern.R;
+import com.example.jingbin.designpattern.app.AppConstant;
+import com.example.jingbin.designpattern.app.EMTagHandler;
+import com.example.jingbin.designpattern.databinding.ActivityPrototypeBinding;
+
+/**
+ * @author jingbin
+ * 原型模式(Prototype Pattern)
+ * 是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
+ * 使用场景:
+ * 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。
+ * 例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
+ * 步骤:
+ * 1. 创建一个实现了 Cloneable 接口的抽象类。Shape(implements Cloneable)
+ * 2. 创建扩展了上面抽象类的实体类。Circle Rectangle Square
+ * 3. 创建一个类,从数据库获取实体类,并把它们存储在一个 Hashtable 中。ShapeCache
+ * 4. 使用 ShapeCache 类来获取存储在 Hashtable 中的形状的克隆。
+ */
+public class PrototypeActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ActivityPrototypeBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_prototype);
+ setTitle("原型模式");
+ binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.PROTOTYPE_DEFINE));
+
+ // 使用 ShapeCache 类来获取存储在 Hashtable 中的形状的克隆。
+ ShapeCache.loadCache();
+
+ binding.btCircle.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Shape shapeCache = ShapeCache.getShape("1");
+ Log.e("Prototype", "Shape: " + shapeCache.type);
+ }
+ });
+
+ binding.btRectangle.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Shape shapeCache = ShapeCache.getShape("2");
+ Log.e("Prototype", "Shape: " + shapeCache.type);
+ }
+ });
+
+ binding.btSquare.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Shape shapeCache = ShapeCache.getShape("3");
+ Log.e("Prototype", "Shape: " + shapeCache.type);
+ }
+ });
+
+ }
+}
diff --git a/app/src/main/java/com/example/jingbin/designpattern/prototype/Shape.java b/app/src/main/java/com/example/jingbin/designpattern/prototype/Shape.java
new file mode 100644
index 0000000..6bcda2c
--- /dev/null
+++ b/app/src/main/java/com/example/jingbin/designpattern/prototype/Shape.java
@@ -0,0 +1,34 @@
+package com.example.jingbin.designpattern.prototype;
+
+import android.util.Log;
+
+/**
+ * Created by jingbin on 2020-01-31.
+ * 1. 创建一个实现了 Cloneable 接口的抽象类。
+ */
+public abstract class Shape implements Cloneable {
+
+ private String id;
+ protected String type;
+
+ public abstract void draw();
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ @Override
+ public Object clone() {
+ Object object = null;
+ try {
+ object = super.clone();
+ } catch (CloneNotSupportedException e) {
+ Log.e("--", e.getMessage());
+ }
+ return object;
+ }
+}
diff --git a/app/src/main/java/com/example/jingbin/designpattern/prototype/ShapeCache.java b/app/src/main/java/com/example/jingbin/designpattern/prototype/ShapeCache.java
new file mode 100644
index 0000000..ada4dfb
--- /dev/null
+++ b/app/src/main/java/com/example/jingbin/designpattern/prototype/ShapeCache.java
@@ -0,0 +1,38 @@
+package com.example.jingbin.designpattern.prototype;
+
+import com.example.jingbin.designpattern.prototype.shapeimpl.Circle;
+import com.example.jingbin.designpattern.prototype.shapeimpl.Rectangle;
+import com.example.jingbin.designpattern.prototype.shapeimpl.Square;
+
+import java.util.Hashtable;
+
+/**
+ * Created by jingbin on 2020-01-31.
+ * 3. 创建一个类,从数据库获取实体类,并把它们存储在一个 Hashtable 中。
+ */
+public class ShapeCache {
+
+ private static Hashtable shapeMap = new Hashtable();
+
+ public static Shape getShape(String shapeId) {
+ Shape shapeCache = shapeMap.get(shapeId);
+ return (Shape) shapeCache.clone();
+ }
+
+ // 对每种形状都运行数据库查询,并创建该形状
+ // shapeMap.put(shapeKey, shape);
+ // 例如,我们要添加三种形状
+ public static void loadCache() {
+ Circle circle = new Circle();
+ circle.setId("1");
+ shapeMap.put(circle.getId(), circle);
+
+ Rectangle rectangle = new Rectangle();
+ rectangle.setId("2");
+ shapeMap.put(rectangle.getId(), rectangle);
+
+ Square square = new Square();
+ square.setId("3");
+ shapeMap.put(square.getId(), square);
+ }
+}
diff --git a/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Circle.java b/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Circle.java
new file mode 100644
index 0000000..2a35288
--- /dev/null
+++ b/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Circle.java
@@ -0,0 +1,23 @@
+package com.example.jingbin.designpattern.prototype.shapeimpl;
+
+import android.util.Log;
+
+import com.example.jingbin.designpattern.prototype.Shape;
+
+/**
+ * Created by jingbin on 2020-01-31.
+ * 2. 创建扩展了上面抽象类的实体类。Circle 圆形
+ */
+public class Circle extends Shape {
+
+ public Circle() {
+ type = "Circle";
+ }
+
+ @Override
+ public void draw() {
+ Log.e("---", "Inside Circle::draw() method.");
+ }
+
+
+}
diff --git a/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Rectangle.java b/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Rectangle.java
new file mode 100644
index 0000000..3d7df46
--- /dev/null
+++ b/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Rectangle.java
@@ -0,0 +1,23 @@
+package com.example.jingbin.designpattern.prototype.shapeimpl;
+
+import android.util.Log;
+
+import com.example.jingbin.designpattern.prototype.Shape;
+
+/**
+ * Created by jingbin on 2020-01-31.
+ * 2. 创建扩展了上面抽象类的实体类。Rectangle 矩形
+ */
+public class Rectangle extends Shape {
+
+ public Rectangle() {
+ type = "Rectangle";
+ }
+
+ @Override
+ public void draw() {
+ Log.e("---", "Inside Rectangle::draw() method.");
+ }
+
+
+}
diff --git a/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Square.java b/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Square.java
new file mode 100644
index 0000000..ddda598
--- /dev/null
+++ b/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Square.java
@@ -0,0 +1,23 @@
+package com.example.jingbin.designpattern.prototype.shapeimpl;
+
+import android.util.Log;
+
+import com.example.jingbin.designpattern.prototype.Shape;
+
+/**
+ * Created by jingbin on 2020-01-31.
+ * 2. 创建扩展了上面抽象类的实体类。Square 正方形
+ */
+public class Square extends Shape {
+
+ public Square() {
+ type = "Square";
+ }
+
+ @Override
+ public void draw() {
+ Log.e("---", "Inside Square::draw() method.");
+ }
+
+
+}
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index e9cd7aa..944ed87 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -135,11 +135,11 @@
android:text="建造者模式" />
+ android:text="原型模式" />
diff --git a/app/src/main/res/layout/activity_prototype.xml b/app/src/main/res/layout/activity_prototype.xml
new file mode 100644
index 0000000..9f7a015
--- /dev/null
+++ b/app/src/main/res/layout/activity_prototype.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
From 42c977f010eebc8b14f9336cd4da8218df28d66c Mon Sep 17 00:00:00 2001
From: youlookwhat <770413277@qq.com>
Date: Fri, 31 Jan 2020 22:03:18 +0800
Subject: [PATCH 09/47] update README.md
---
README.md | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 074b0a4..f8af5b7 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,16 @@
# DesignPattern
-#### Java 设计模式(观察者模式、工厂模式、单例模式、策略模式、命令模式、装饰者模式、外观模式、模板方法模式、状态模式、建造者模式)
+#### Java 设计模式(观察者模式、工厂模式、单例模式、策略模式、命令模式、装饰者模式、外观模式、模板方法模式、状态模式、建造者模式、原型模式)
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
设计模式分为三种类型,共23种:
- - **创建型模式**:[单例模式](https://github.com/youlookwhat/DesignPattern#3-单例设计模式)、[抽象工厂模式](https://github.com/youlookwhat/DesignPattern#2-工厂模式)、[建造者模式](https://github.com/youlookwhat/DesignPattern#11-建造者模式)、[工厂模式](https://github.com/youlookwhat/DesignPattern#2-工厂模式)、原型模式。
+ - **创建型模式**:[单例模式](https://github.com/youlookwhat/DesignPattern#3-单例设计模式)、[抽象工厂模式](https://github.com/youlookwhat/DesignPattern#2-工厂模式)、[建造者模式](https://github.com/youlookwhat/DesignPattern#11-建造者模式)、[工厂模式](https://github.com/youlookwhat/DesignPattern#2-工厂模式)、[原型模式](https://github.com/youlookwhat/DesignPattern#12-原型模式)。
- **结构型模式**:[适配器模式](https://github.com/youlookwhat/DesignPattern#5-适配器模式)、桥接模式、[装饰模式](https://github.com/youlookwhat/DesignPattern#7-装饰者模式)、组合模式、[外观模式](https://github.com/youlookwhat/DesignPattern#8-外观模式)、享元模式、代理模式。
- **行为型模式**:[模版方法模式](https://github.com/youlookwhat/DesignPattern#9-模板方法模式)、[命令模式](https://github.com/youlookwhat/DesignPattern#6-命令模式)、迭代器模式、[观察者模式](https://github.com/youlookwhat/DesignPattern#1-观察者模式)、中介者模式、备忘录模式、解释器模式、[状态模式](https://github.com/youlookwhat/DesignPattern#10-状态模式)、[策略模式](https://github.com/youlookwhat/DesignPattern#4-策略模式)、职责链模式(责任链模式)、访问者模式。
-> 参照Hongyang的CSDN博客所写。如有错误欢迎指正,如有侵权,请联系我删除。
+> 参照Hongyang、极客学院等文章所写。如有错误欢迎指正,如有侵权,请联系我删除。
----
@@ -529,7 +529,12 @@
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
+共分四步:
+- 1、创建一个实现了 Cloneable 接口的抽象类。Shape(implements Cloneable)
+- 2、创建扩展了上面抽象类的实体类。Circle Rectangle Square
+- 3、创建一个类,从数据库获取实体类,并把它们存储在一个 Hashtable 中。ShapeCache
+- 4、使用 ShapeCache 类来获取存储在 Hashtable 中的形状的克隆。
## Download
From 4d8f7717e64fe432f99aae6b988ffd02d4f75f43 Mon Sep 17 00:00:00 2001
From: youlookwhat <770413277@qq.com>
Date: Sat, 1 Feb 2020 14:08:18 +0800
Subject: [PATCH 10/47] update README.md
---
README.md | 93 +++++++++++++++++--
.../prototype/shapeimpl/Circle.java | 1 -
2 files changed, 87 insertions(+), 7 deletions(-)
diff --git a/README.md b/README.md
index f8af5b7..6ca64a7 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,4 @@
# DesignPattern
-
-#### Java 设计模式(观察者模式、工厂模式、单例模式、策略模式、命令模式、装饰者模式、外观模式、模板方法模式、状态模式、建造者模式、原型模式)
-
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
设计模式分为三种类型,共23种:
@@ -531,11 +528,95 @@
共分四步:
-- 1、创建一个实现了 Cloneable 接口的抽象类。Shape(implements Cloneable)
-- 2、创建扩展了上面抽象类的实体类。Circle Rectangle Square
-- 3、创建一个类,从数据库获取实体类,并把它们存储在一个 Hashtable 中。ShapeCache
+- 1、创建一个实现了 Cloneable 接口的抽象类。[Shape](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/prototype/Shape.java)(implements Cloneable)
+
+ ```java
+ public abstract class Shape implements Cloneable {
+
+ private String id;
+ protected String type;
+
+ public abstract void draw();
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ @Override
+ public Object clone() {
+ Object object = null;
+ try {
+ object = super.clone();
+ } catch (CloneNotSupportedException e) {
+ Log.e("--", e.getMessage());
+ }
+ return object;
+ }
+ }
+ ```
+
+- 2、创建扩展了上面抽象类的实体类。[Circle](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Circle.java)、[Rectangle](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Rectangle.java)、[Square](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Square.java)
+
+ ```java
+ public class Circle extends Shape {
+
+ public Circle() {
+ type = "Circle";
+ }
+
+ @Override
+ public void draw() {
+ Log.e("---", "Inside Circle::draw() method.");
+ }
+
+ }
+ ```
+
+- 3、创建一个类,从数据库获取实体类,并把它们存储在一个 Hashtable 中。[ShapeCache](https://github.com/youlookwhat/DesignPattern/blob/master/app/src/main/java/com/example/jingbin/designpattern/prototype/ShapeCache.java)
+
+ ```java
+ public class ShapeCache {
+
+ private static Hashtable shapeMap = new Hashtable();
+
+ public static Shape getShape(String shapeId) {
+ Shape shapeCache = shapeMap.get(shapeId);
+ return (Shape) shapeCache.clone();
+ }
+
+ // 对每种形状都运行数据库查询,并创建该形状
+ // shapeMap.put(shapeKey, shape);
+ // 例如,我们要添加三种形状
+ public static void loadCache() {
+ Circle circle = new Circle();
+ circle.setId("1");
+ shapeMap.put(circle.getId(), circle);
+
+ Rectangle rectangle = new Rectangle();
+ rectangle.setId("2");
+ shapeMap.put(rectangle.getId(), rectangle);
+
+ Square square = new Square();
+ square.setId("3");
+ shapeMap.put(square.getId(), square);
+ }
+ }
+ ```
+
- 4、使用 ShapeCache 类来获取存储在 Hashtable 中的形状的克隆。
+ ```java
+ // 使用 ShapeCache 类来获取存储在 Hashtable 中的形状的克隆。
+ ShapeCache.loadCache();
+ Shape shapeCache1 = ShapeCache.getShape("1");
+ Shape shapeCache2 = ShapeCache.getShape("2");
+ Shape shapeCache3 = ShapeCache.getShape("3");
+ ```
+
## Download
- [DesignPattern.apk](http://download.csdn.net/detail/jingbin_/9684545)
diff --git a/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Circle.java b/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Circle.java
index 2a35288..abaf3ea 100644
--- a/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Circle.java
+++ b/app/src/main/java/com/example/jingbin/designpattern/prototype/shapeimpl/Circle.java
@@ -19,5 +19,4 @@ public void draw() {
Log.e("---", "Inside Circle::draw() method.");
}
-
}
From 5092d1bc112c477d135b1faddd18e9edf3ce1117 Mon Sep 17 00:00:00 2001
From: youlookwhat <770413277@qq.com>
Date: Sat, 1 Feb 2020 15:17:30 +0800
Subject: [PATCH 11/47] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E4=BA=AB=E5=85=83?=
=?UTF-8?q?=E6=A8=A1=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/src/main/AndroidManifest.xml | 7 ++-
.../jingbin/designpattern/MainActivity.java | 7 +++
.../designpattern/app/AppConstant.java | 1 +
.../designpattern/flyweight/Circle.java | 37 ++++++++++++
.../flyweight/FlyweightActivity.java | 60 +++++++++++++++++++
.../designpattern/flyweight/Shape.java | 9 +++
.../designpattern/flyweight/ShapeFactory.java | 25 ++++++++
.../main/res/layout/activity_flyweight.xml | 52 ++++++++++++++++
app/src/main/res/layout/activity_main.xml | 21 +++++++
.../main/res/layout/activity_prototype.xml | 2 +-
10 files changed, 219 insertions(+), 2 deletions(-)
create mode 100644 app/src/main/java/com/example/jingbin/designpattern/flyweight/Circle.java
create mode 100644 app/src/main/java/com/example/jingbin/designpattern/flyweight/FlyweightActivity.java
create mode 100644 app/src/main/java/com/example/jingbin/designpattern/flyweight/Shape.java
create mode 100644 app/src/main/java/com/example/jingbin/designpattern/flyweight/ShapeFactory.java
create mode 100644 app/src/main/res/layout/activity_flyweight.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7cc302c..2357d40 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -11,7 +11,6 @@
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
-
@@ -52,6 +51,12 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/example/jingbin/designpattern/MainActivity.java b/app/src/main/java/com/example/jingbin/designpattern/MainActivity.java
index a1cdda6..5d6f3a0 100644
--- a/app/src/main/java/com/example/jingbin/designpattern/MainActivity.java
+++ b/app/src/main/java/com/example/jingbin/designpattern/MainActivity.java
@@ -12,6 +12,7 @@
import com.example.jingbin.designpattern.decorator.DecoratorActivity;
import com.example.jingbin.designpattern.facade.FacadeActivity;
import com.example.jingbin.designpattern.factory.FactoryActivity;
+import com.example.jingbin.designpattern.flyweight.FlyweightActivity;
import com.example.jingbin.designpattern.observer.ObserverActivity;
import com.example.jingbin.designpattern.prototype.PrototypeActivity;
import com.example.jingbin.designpattern.singleton.SingletonActivity;
@@ -51,6 +52,8 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
Button btBuilder;
@BindView(R.id.bt_prototype)
Button btPrototype;
+ @BindView(R.id.bt_flyweight)
+ Button btFlyweight;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -73,6 +76,7 @@ private void initListener() {
btState.setOnClickListener(this);
btBuilder.setOnClickListener(this);
btPrototype.setOnClickListener(this);
+ btFlyweight.setOnClickListener(this);
}
@Override
@@ -114,6 +118,9 @@ public void onClick(View v) {
case R.id.bt_prototype:// 原型模式
startActivity(new Intent(this, PrototypeActivity.class));
break;
+ case R.id.bt_flyweight:// 享元模式
+ startActivity(new Intent(this, FlyweightActivity.class));
+ break;
default:
break;
}
diff --git a/app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java b/app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java
index 3a64b7a..7952282 100644
--- a/app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java
+++ b/app/src/main/java/com/example/jingbin/designpattern/app/AppConstant.java
@@ -16,6 +16,7 @@ public class AppConstant {
public final static String TEMPLATEMETHOD_DEFINE = "模板方法模式(Template Method Pattern)定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。(模版方法定义了一个算法的步骤,并且允许子类为一个或多个步骤提供实现。)";
public final static String BUILDER_DEFINE = "建造者模式(Builder Pattern)建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。";
public final static String PROTOTYPE_DEFINE = "原型模式(Prototype Pattern)定义:是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。";
+ public final static String FLYWEIGHT_DEFINE = "享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。";
public final static String JDGC_FACTORY_DEFINE = "简单工厂模式定义:通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。";
public final static String GCFF_FACTORY_DEFINE = "工厂方法模式定义:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式把类实例化的过程推迟到子类。";
public final static String CXGC_FACTORY_DEFINE = "抽象工厂模式定义:提供一个接口,用于创建相关的或依赖对象的家族,而不需要明确指定具体类。";
diff --git a/app/src/main/java/com/example/jingbin/designpattern/flyweight/Circle.java b/app/src/main/java/com/example/jingbin/designpattern/flyweight/Circle.java
new file mode 100644
index 0000000..775cf33
--- /dev/null
+++ b/app/src/main/java/com/example/jingbin/designpattern/flyweight/Circle.java
@@ -0,0 +1,37 @@
+package com.example.jingbin.designpattern.flyweight;
+
+import android.util.Log;
+
+/**
+ * Created by jingbin on 2020-02-01.
+ * 2. 创建实现接口的实体类。
+ */
+public class Circle implements Shape {
+
+ private String color;
+ private int x;
+ private int y;
+ private int radius;
+
+ public Circle(String color) {
+ this.color = color;
+ }
+
+ public void setX(int x) {
+ this.x = x;
+ }
+
+ public void setY(int y) {
+ this.y = y;
+ }
+
+ public void setRadius(int radius) {
+ this.radius = radius;
+ }
+
+ @Override
+ public void draw() {
+ Log.e("---", "Circle: Draw() [Color : " + color
+ + ", x : " + x + ", y :" + y + ", radius :" + radius);
+ }
+}
diff --git a/app/src/main/java/com/example/jingbin/designpattern/flyweight/FlyweightActivity.java b/app/src/main/java/com/example/jingbin/designpattern/flyweight/FlyweightActivity.java
new file mode 100644
index 0000000..ee36065
--- /dev/null
+++ b/app/src/main/java/com/example/jingbin/designpattern/flyweight/FlyweightActivity.java
@@ -0,0 +1,60 @@
+package com.example.jingbin.designpattern.flyweight;
+
+import android.databinding.DataBindingUtil;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+
+import com.example.jingbin.designpattern.R;
+import com.example.jingbin.designpattern.app.AppConstant;
+import com.example.jingbin.designpattern.app.EMTagHandler;
+import com.example.jingbin.designpattern.databinding.ActivityFlyweightBinding;
+
+/**
+ * @author jingbin
+ * 享元模式(Flyweight Pattern)
+ * 主要用于减少创建对象的数量,以减少内存占用和提高性能。
+ * 这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
+ */
+public class FlyweightActivity extends AppCompatActivity {
+
+ private static final String color[] = {"Red", "Green", "Blue", "Yellow", "White", "Black"};
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ActivityFlyweightBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_flyweight);
+ setTitle("享元模式");
+ binding.tvDefine.setText(EMTagHandler.fromHtml(AppConstant.FLYWEIGHT_DEFINE));
+
+ binding.btGetCircle.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // 4. 使用该工厂,通过传递颜色信息来获取实体类的对象。
+ for (int i = 0; i < 20; i++) {
+ Circle circle = (Circle) ShapeFactory.getShape(getRandomColor());
+ circle.setX(getRandomX());
+ circle.setY(getRandomY());
+ circle.setRadius(100);
+ circle.draw();
+ }
+ }
+ });
+
+ }
+
+ /**
+ * 0.0-1.0 * [1-6]
+ */
+ private static String getRandomColor() {
+ return color[(int) (Math.random() * color.length)];
+ }
+
+ private static int getRandomX() {
+ return (int) (Math.random() * 100);
+ }
+
+ private static int getRandomY() {
+ return (int) (Math.random() * 100);
+ }
+}
diff --git a/app/src/main/java/com/example/jingbin/designpattern/flyweight/Shape.java b/app/src/main/java/com/example/jingbin/designpattern/flyweight/Shape.java
new file mode 100644
index 0000000..bb7a9df
--- /dev/null
+++ b/app/src/main/java/com/example/jingbin/designpattern/flyweight/Shape.java
@@ -0,0 +1,9 @@
+package com.example.jingbin.designpattern.flyweight;
+
+/**
+ * Created by jingbin on 2020-02-01.
+ * 1. 创建一个接口。
+ */
+public interface Shape {
+ void draw();
+}
diff --git a/app/src/main/java/com/example/jingbin/designpattern/flyweight/ShapeFactory.java b/app/src/main/java/com/example/jingbin/designpattern/flyweight/ShapeFactory.java
new file mode 100644
index 0000000..a0f97bf
--- /dev/null
+++ b/app/src/main/java/com/example/jingbin/designpattern/flyweight/ShapeFactory.java
@@ -0,0 +1,25 @@
+package com.example.jingbin.designpattern.flyweight;
+
+import android.util.Log;
+
+import java.util.HashMap;
+
+/**
+ * Created by jingbin on 2020-02-01.
+ * 3. 创建一个工厂,生成基于给定信息的实体类的对象。
+ */
+public class ShapeFactory {
+
+ private static final HashMap circleMap = new HashMap();
+
+ public static Shape getShape(String color) {
+ Shape shape = circleMap.get(color);
+ if (shape == null) {
+ shape = new Circle(color);
+ circleMap.put(color, shape);
+ Log.e("getShape", "Creating circle of color : " + color);
+ }
+ return shape;
+ }
+
+}
diff --git a/app/src/main/res/layout/activity_flyweight.xml b/app/src/main/res/layout/activity_flyweight.xml
new file mode 100644
index 0000000..0c964bc
--- /dev/null
+++ b/app/src/main/res/layout/activity_flyweight.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 944ed87..d91b71a 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -143,6 +143,27 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_prototype.xml b/app/src/main/res/layout/activity_prototype.xml
index 9f7a015..daa582d 100644
--- a/app/src/main/res/layout/activity_prototype.xml
+++ b/app/src/main/res/layout/activity_prototype.xml
@@ -10,7 +10,7 @@
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
- tools:context=".builder.BuilderActivity">
+ tools:context=".prototype.PrototypeActivity">