diff --git a/.gitignore b/.gitignore index 19ee72f..892a5d3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .gitignore build/ .settings/* +.idea diff --git a/JavaCodeAcc.iml b/JavaCodeAcc.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/JavaCodeAcc.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 0b311fc..7b6b0e0 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,3 @@ Java代码积累:**[并发](./README.md/#concurrency) [设计模式](./README. ## basic - [正则表达式使用方式](./src/basic/UsingRegex.java) - -## 如果有帮到你,欢迎随意打赏,感谢~ -![微信支付](https://raw.githubusercontent.com/echoTheLiar/JavaCodeAcc/master/wechatpay.JPG) -![支付宝](https://raw.githubusercontent.com/echoTheLiar/JavaCodeAcc/master/alipay.JPG) diff --git a/alipay.JPG b/alipay.JPG deleted file mode 100644 index 714155f..0000000 Binary files a/alipay.JPG and /dev/null differ diff --git a/src/designpattern/factory/simple/Operation.java b/src/designpattern/factory/Operation.java similarity index 71% rename from src/designpattern/factory/simple/Operation.java rename to src/designpattern/factory/Operation.java index 629fb67..144f2d9 100644 --- a/src/designpattern/factory/simple/Operation.java +++ b/src/designpattern/factory/Operation.java @@ -1,14 +1,13 @@ -package designpattern.factory.simple; +package designpattern.factory; /** * 操作类抽象类 - * - * @author liu yuning * + * @author liu yunings */ public abstract class Operation { public double numberA; public double numberB; - + public abstract double result(); } diff --git a/src/designpattern/factory/abstraction/Client.java b/src/designpattern/factory/abstraction/Client.java index 41ffec2..768e8cd 100644 --- a/src/designpattern/factory/abstraction/Client.java +++ b/src/designpattern/factory/abstraction/Client.java @@ -1,21 +1,20 @@ package designpattern.factory.abstraction; -import designpattern.factory.simple.Operation; +import designpattern.factory.Operation; /** * 客户端 - * - * @author liu yuning * + * @author liu yuning */ public class Client { public static void main(String[] args) throws InstantiationException, - IllegalAccessException { - Operation operation = OperationFactory.createOperation("/"); - - operation.numberA = 7; - operation.numberB = 8; - - System.out.println(operation.result()); + IllegalAccessException { + Operation operation = OperationFactory.createOperation("/"); + + operation.numberA = 7; + operation.numberB = 8; + + System.out.println(operation.result()); } } diff --git a/src/designpattern/factory/abstraction/OperationFactory.java b/src/designpattern/factory/abstraction/OperationFactory.java index b13483a..19f22f2 100644 --- a/src/designpattern/factory/abstraction/OperationFactory.java +++ b/src/designpattern/factory/abstraction/OperationFactory.java @@ -3,7 +3,7 @@ import java.util.HashMap; import java.util.Map; -import designpattern.factory.simple.Operation; +import designpattern.factory.Operation; import designpattern.factory.simple.OperationAdd; import designpattern.factory.simple.OperationDiv; import designpattern.factory.simple.OperationMul; @@ -11,34 +11,28 @@ /** * 利用反射改造简单工厂模式,去掉分支判断的逻辑 - * - * @author liu yuning * + * @author liu yuning */ public class OperationFactory { - private static Map> allOperationMaps = new HashMap>(); - + private static final Map> allOperationMaps = new HashMap<>(); + public static void fillMap() { - allOperationMaps.put("+", OperationAdd.class); - allOperationMaps.put("-", OperationSub.class); - allOperationMaps.put("*", OperationMul.class); - allOperationMaps.put("/", OperationDiv.class); + allOperationMaps.put("+", OperationAdd.class); + allOperationMaps.put("-", OperationSub.class); + allOperationMaps.put("*", OperationMul.class); + allOperationMaps.put("/", OperationDiv.class); } - + public static Operation createOperation(String operator) - throws InstantiationException, IllegalAccessException { - Operation operation; - - fillMap(); - Class operationClass = allOperationMaps.get(operator); - - if (operationClass == null) { - throw new RuntimeException("unsupported operation"); - } - - operation = (Operation) operationClass.newInstance(); - - return operation; + throws InstantiationException, IllegalAccessException { + fillMap(); + Class operationClass = allOperationMaps.get(operator); + + if (operationClass == null) { + throw new RuntimeException("unsupported operation"); + } + return operationClass.newInstance(); } - + } diff --git a/src/designpattern/factory/method/FactoryClient.java b/src/designpattern/factory/method/FactoryClient.java deleted file mode 100644 index 6e833d7..0000000 --- a/src/designpattern/factory/method/FactoryClient.java +++ /dev/null @@ -1,22 +0,0 @@ -package designpattern.factory.method; - -import designpattern.factory.simple.Operation; - -/** - * 工厂方法客户端 - * - * @author liu yuning - * - */ -public class FactoryClient { - public static void main(String[] args) { - IFactory operFactory = new DivFactory(); - Operation operation = operFactory.createOperation(); - - operation.numberA = 3.4; - operation.numberB = 4.5; - - System.out.println(operation.result()); - - } -} \ No newline at end of file diff --git a/src/designpattern/factory/method/IFactory.java b/src/designpattern/factory/method/IFactory.java index d70ae69..37e9331 100644 --- a/src/designpattern/factory/method/IFactory.java +++ b/src/designpattern/factory/method/IFactory.java @@ -1,6 +1,6 @@ package designpattern.factory.method; -import designpattern.factory.simple.Operation; +import designpattern.factory.Operation; import designpattern.factory.simple.OperationAdd; import designpattern.factory.simple.OperationDiv; import designpattern.factory.simple.OperationMul; @@ -8,46 +8,45 @@ /** * 工厂接口 - * - * @author liu yuning * + * @author liu yuning */ public interface IFactory { public Operation createOperation(); } class AddFactory implements IFactory { - + @Override public Operation createOperation() { - return new OperationAdd(); + return new OperationAdd(); } - + } class SubFactory implements IFactory { - + @Override public Operation createOperation() { - return new OperationSub(); + return new OperationSub(); } - + } class MulFactory implements IFactory { - + @Override public Operation createOperation() { - return new OperationMul(); + return new OperationMul(); } - + } class DivFactory implements IFactory { - + @Override public Operation createOperation() { - return new OperationDiv(); + return new OperationDiv(); } - + } \ No newline at end of file diff --git a/src/designpattern/factory/method/MethodFactoryTest.java b/src/designpattern/factory/method/MethodFactoryTest.java new file mode 100644 index 0000000..2367376 --- /dev/null +++ b/src/designpattern/factory/method/MethodFactoryTest.java @@ -0,0 +1,25 @@ +package designpattern.factory.method; + +import designpattern.factory.Operation; + +/** + * 工厂方法客户端, + * 这里对比简单工厂方法来讲,客户端上其实是没有区别的 + * 我们之前将,简单工厂是因为违背了ocp原则,添加一个功能需要对工厂添加if else,这里就对之前的工厂进行了修改,但是工厂方法的话, + * 这里只需要新增工厂类,即可,对添加开放,这里不要管客户端是怎么调用的,工厂方法的开闭原则的重点应该放在工厂本身. + * + * @author liu yuning + * + */ +public class MethodFactoryTest { + public static void main(String[] args) { + IFactory operFactory = new DivFactory(); + Operation operation = operFactory.createOperation(); + + operation.numberA = 3.4; + operation.numberB = 4.5; + + System.out.println(operation.result()); + + } +} \ No newline at end of file diff --git a/src/designpattern/factory/simple/Calculator.java b/src/designpattern/factory/simple/Calculator.java deleted file mode 100644 index a2ebcf8..0000000 --- a/src/designpattern/factory/simple/Calculator.java +++ /dev/null @@ -1,21 +0,0 @@ -package designpattern.factory.simple; - -/** - * 使用工厂方法生成实例完成运算操作 - * - * @author liu yuning - * - */ -public class Calculator { - public static void main(String[] args) { - Operation operation; - char operator; - - operator = '+'; - operation = OperationFactory.createOperation(operator); - operation.numberA = 1.2; - operation.numberB = 2.3; - - System.out.println(operation.result()); - } -} \ No newline at end of file diff --git a/src/designpattern/factory/simple/OperationAdd.java b/src/designpattern/factory/simple/OperationAdd.java index 985325a..7b9abd7 100644 --- a/src/designpattern/factory/simple/OperationAdd.java +++ b/src/designpattern/factory/simple/OperationAdd.java @@ -1,5 +1,7 @@ package designpattern.factory.simple; +import designpattern.factory.Operation; + /** * 加法类 * diff --git a/src/designpattern/factory/simple/OperationDiv.java b/src/designpattern/factory/simple/OperationDiv.java index 631dccb..b716f4e 100644 --- a/src/designpattern/factory/simple/OperationDiv.java +++ b/src/designpattern/factory/simple/OperationDiv.java @@ -1,5 +1,7 @@ package designpattern.factory.simple; +import designpattern.factory.Operation; + /** * 除法类 * diff --git a/src/designpattern/factory/simple/OperationFactory.java b/src/designpattern/factory/simple/OperationFactory.java deleted file mode 100644 index 76aa9dc..0000000 --- a/src/designpattern/factory/simple/OperationFactory.java +++ /dev/null @@ -1,32 +0,0 @@ -package designpattern.factory.simple; - -/** - * 操作类工厂类 - * - * @author liu yuning - * - */ -public class OperationFactory { - public static Operation createOperation(char operator) { - Operation operation = null; - - switch (operator) { - case '+': - operation = new OperationAdd(); - break; - case '-': - operation = new OperationSub(); - break; - case '*': - operation = new OperationMul(); - break; - case '/': - operation = new OperationDiv(); - break; - default: - throw new RuntimeException("unsupported operation"); - } - - return operation; - } -} \ No newline at end of file diff --git a/src/designpattern/factory/simple/OperationMul.java b/src/designpattern/factory/simple/OperationMul.java index d4aa7cd..4865959 100644 --- a/src/designpattern/factory/simple/OperationMul.java +++ b/src/designpattern/factory/simple/OperationMul.java @@ -1,5 +1,7 @@ package designpattern.factory.simple; +import designpattern.factory.Operation; + /** * 乘法类 * diff --git a/src/designpattern/factory/simple/OperationSub.java b/src/designpattern/factory/simple/OperationSub.java index ea31799..2b0fe5b 100644 --- a/src/designpattern/factory/simple/OperationSub.java +++ b/src/designpattern/factory/simple/OperationSub.java @@ -1,5 +1,7 @@ package designpattern.factory.simple; +import designpattern.factory.Operation; + /** * 减法类 * diff --git a/src/designpattern/factory/simple/SimpleFactory.java b/src/designpattern/factory/simple/SimpleFactory.java new file mode 100644 index 0000000..e10bb42 --- /dev/null +++ b/src/designpattern/factory/simple/SimpleFactory.java @@ -0,0 +1,37 @@ +package designpattern.factory.simple; + +import designpattern.factory.Operation; + +/** + * 简单工厂, + * 优点是比较好理解,简单易操作。 + * 缺点是类的创建依赖工厂类,如果想要拓展程序,必须对工厂类进行修改, + * 这违反了设计模式的开闭原则(OCP),即对扩展开放,对修改关闭。 + * 比如现在想添加一个开方的运算,需要修改工厂的判断逻辑,添加一个case条件. + * + * @author liu yuning + */ +public class SimpleFactory { + public static Operation createOperation(char operator) { + Operation operation = null; + + switch (operator) { + case '+': + operation = new OperationAdd(); + break; + case '-': + operation = new OperationSub(); + break; + case '*': + operation = new OperationMul(); + break; + case '/': + operation = new OperationDiv(); + break; + default: + throw new RuntimeException("unsupported operation"); + } + + return operation; + } +} \ No newline at end of file diff --git a/src/designpattern/factory/simple/SimpleFactoryTest.java b/src/designpattern/factory/simple/SimpleFactoryTest.java new file mode 100644 index 0000000..576d51f --- /dev/null +++ b/src/designpattern/factory/simple/SimpleFactoryTest.java @@ -0,0 +1,22 @@ +package designpattern.factory.simple; + +import designpattern.factory.Operation; + +/** + * 使用工厂方法生成实例完成运算操作 + * + * @author liu yuning + */ +public class SimpleFactoryTest { + public static void main(String[] args) { + Operation operation; + char operator; + + operator = '+'; + operation = SimpleFactory.createOperation(operator); + operation.numberA = 1.2; + operation.numberB = 2.3; + + System.out.println(operation.result()); + } +} \ No newline at end of file diff --git a/src/designpattern/prototype/PrototypeClient.java b/src/designpattern/prototype/PrototypeClient.java index ce628c0..6d89bfd 100644 --- a/src/designpattern/prototype/PrototypeClient.java +++ b/src/designpattern/prototype/PrototypeClient.java @@ -4,59 +4,58 @@ /** * 原型模式客户端 演示深度拷贝和浅度拷贝 - * - * @Todo 考虑优化此处的重复代码 - * @author liu yuning * + * @author liu yuning + * @Todo 考虑优化此处的重复代码 */ public class PrototypeClient { public static void shallowCopy() throws CloneNotSupportedException { - Resume aResume = new Resume(); - aResume.setName("大鸟 ").setGender("男 ").setAge(25); - aResume.setWorkExperience("1999-2002, ", "XX公司"); - - Resume bResume = (Resume) aResume.clone(); - bResume.setWorkExperience("1999-2002, ", "YY公司"); - - Resume cResume = (Resume) aResume.clone(); - cResume.setWorkExperience("1999-2002, ", "ZZ公司"); - - System.out.println(">>>>>>浅度拷贝:"); - aResume.display(); - bResume.display(); - cResume.display(); + Resume aResume = new Resume(); + aResume.setName("大鸟 ").setGender("男 ").setAge(25); + aResume.setWorkExperience("1999-2002, ", "XX公司"); + + Resume bResume = (Resume) aResume.clone(); + bResume.setWorkExperience("1999-2002, ", "YY公司"); + + Resume cResume = (Resume) aResume.clone(); + cResume.setWorkExperience("1999-2002, ", "ZZ公司"); + + System.out.println(">>>>>>浅度拷贝:"); + aResume.display(); + bResume.display(); + cResume.display(); } - + public static void deepCopy() throws CloneNotSupportedException, - ClassNotFoundException, IOException { - Resume aResume = new Resume(); - aResume.setName("大鸟 ").setGender("男 ").setAge(25); - aResume.setWorkExperience("1999-2002, ", "XX公司"); - - Resume bResume = (Resume) aResume.deepClone(); - bResume.setWorkExperience("1999-2002, ", "YY公司"); - - Resume cResume = (Resume) aResume.deepClone(); - cResume.setWorkExperience("1999-2002, ", "ZZ公司"); - - System.out.println(">>>>>>深度拷贝:"); - aResume.display(); - bResume.display(); - cResume.display(); - + ClassNotFoundException, IOException { + Resume aResume = new Resume(); + aResume.setName("大鸟 ").setGender("男 ").setAge(25); + aResume.setWorkExperience("1999-2002, ", "XX公司"); + + Resume bResume = (Resume) aResume.deepClone(); + bResume.setWorkExperience("1999-2002, ", "YY公司"); + + Resume cResume = (Resume) aResume.deepClone(); + cResume.setWorkExperience("1999-2002, ", "ZZ公司"); + + System.out.println(">>>>>>深度拷贝:"); + aResume.display(); + bResume.display(); + cResume.display(); + } - + public static void main(String[] args) throws CloneNotSupportedException, - ClassNotFoundException, IOException { - - // 浅度拷贝 - shallowCopy(); - - System.out.println("=================================="); - - // 深度拷贝 - deepCopy(); - + ClassNotFoundException, IOException { + + // 浅度拷贝 + shallowCopy(); + + System.out.println("=================================="); + + // 深度拷贝 + deepCopy(); + } - + } diff --git a/src/designpattern/prototype/Resume.java b/src/designpattern/prototype/Resume.java index 19a12e9..b3f55ef 100644 --- a/src/designpattern/prototype/Resume.java +++ b/src/designpattern/prototype/Resume.java @@ -9,87 +9,86 @@ /** * 简历类 - * - * @author liu yuning * + * @author liu yuning */ public class Resume implements Cloneable, Serializable { private static final long serialVersionUID = -4410449301166191440L; - + private String name; private String gender; private int age; - + // 引用“工作经历”对象,为演示深度拷贝和浅度拷贝而用 private WorkExperience workExperience; - + public Resume() { - // 在“简历”类实例化时,同时实例化“工作经历”类 - workExperience = new WorkExperience(); + // 在“简历”类实例化时,同时实例化“工作经历”类 + workExperience = new WorkExperience(); } - + public void display() { - System.out.println(this.getName() + " " + this.getGender() + " " - + this.getAge() + "\n工作经历: " - + this.getWorkExperience().getWorkDate() + " " - + this.getWorkExperience().getWorkCompany()); + System.out.println(this.getName() + " " + this.getGender() + " " + + this.getAge() + "\n工作经历: " + + this.getWorkExperience().getWorkDate() + " " + + this.getWorkExperience().getWorkCompany()); } - + @Override protected Object clone() throws CloneNotSupportedException { - return super.clone(); + return super.clone(); } - + // 通过对象序列化,实现深度拷贝 public Object deepClone() throws IOException, ClassNotFoundException { - // 将对象写入流内 - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(bos); - oos.writeObject(this); - - // 从流内读出对象 - ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream( - bos.toByteArray())); - return ois.readObject(); - + // 将对象写入流内 + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(bos); + oos.writeObject(this); + + // 从流内读出对象 + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream( + bos.toByteArray())); + return ois.readObject(); + } - + public String getName() { - return name; + return name; } - + public Resume setName(String name) { - this.name = name; - - return this; + this.name = name; + + return this; } - + public String getGender() { - return gender; + return gender; } - + public Resume setGender(String gender) { - this.gender = gender; - - return this; + this.gender = gender; + + return this; } - + public int getAge() { - return age; + return age; } - + public Resume setAge(int age) { - this.age = age; - - return this; + this.age = age; + + return this; } - + public WorkExperience getWorkExperience() { - return workExperience; + return workExperience; } - + public void setWorkExperience(String workDate, String workCompany) { - workExperience.setWorkDate(workDate); - workExperience.setWorkCompany(workCompany); + workExperience.setWorkDate(workDate); + workExperience.setWorkCompany(workCompany); } } diff --git a/src/designpattern/prototype/WorkExperience.java b/src/designpattern/prototype/WorkExperience.java index d40f7ca..7228b9f 100644 --- a/src/designpattern/prototype/WorkExperience.java +++ b/src/designpattern/prototype/WorkExperience.java @@ -4,34 +4,33 @@ /** * 工作经历类,为演示深度拷贝和浅度拷贝而用 - * - * @author liu yuning * + * @author liu yuning */ public class WorkExperience implements Serializable { private static final long serialVersionUID = 1L; - + private String workDate; private String workCompany; - + public String getWorkDate() { - return workDate; + return workDate; } - + public WorkExperience setWorkDate(String workDate) { - this.workDate = workDate; - - return this; + this.workDate = workDate; + + return this; } - + public String getWorkCompany() { - return workCompany; + return workCompany; } - + public WorkExperience setWorkCompany(String workCompany) { - this.workCompany = workCompany; - - return this; + this.workCompany = workCompany; + + return this; } - + } diff --git a/wechatpay.JPG b/wechatpay.JPG deleted file mode 100644 index 0478ac7..0000000 Binary files a/wechatpay.JPG and /dev/null differ