ps:这只是锻炼我自己写博客的能力
一. 类之间的关系几种关系
实现
,继承
,组合
,聚合
,依赖
类之间的关系就是上面的几种
-
- 实现:接口和类之间的关系
can-do
- 实现:接口和类之间的关系
-
- 继承: 类和类之间的关系 (接口和接口之间继承关系)
is-a
- 继承: 类和类之间的关系 (接口和接口之间继承关系)
-
- 组合:像台式机和cpu之间,比聚合关系更强
contains-a
- 组合:像台式机和cpu之间,比聚合关系更强
-
- 聚合:暂时组装的关系
has-a
- 聚合:暂时组装的关系
-
- 依赖:一个类用到另一个类,比如电脑类要执行发邮件方法,那么他可能依赖一个邮件类
二. 在设计模式中遵循的6大原则
- 1.开闭原则:对扩展开放,对修改关闭.(一个稳定的功能不应该去修改其原有的代码,而是通过新增的方式进行扩展,依赖于接口或者抽象类实现)
- 2.里氏替换原则:代码中任何基类出现的地方用任意子类可以进行替换,而不影响原来的功能
- 3.依赖倒转原则:针对接口编程,依赖抽象而不是依赖于具体编程
- 4.接口隔离原则:使用多个隔离的接口优于单一全面的接口
- 5.迪米特原则:也就是最少知道原则,一个实体应尽量少的与其他实体发生作用
- 6.合成复用原则:尽量使用合成/聚合的方式,而不是使用继承
三. 设计模式的解释
1.简单工程模式
简单工厂是一个大而全的工厂(上帝工厂),不管你需要什么都可以增加if-else if来达到生产出产品的目的. 但是简单工厂每增加一种产品就要修改代码(不满足开闭原则),工厂大而全缺乏同一的标准.
产品基类:
public abstract class Computer {
protected String type;
protected String brand;
//省略无参构造器 有参构造器 getter setter方法
}
复制代码
具体产品类:
public class HaseeComputer extends Computer {
public HaseeComputer(){
this.brand="神船";
this.type="笔记本";
}
public HaseeComputer(String type, String brand) {
super(type, brand);
}
}
public class LenovoComputer extends Computer {
public LenovoComputer(){
this.brand="联想";
this.type="笔记本";
}
public LenovoComputer(String type, String brand) {
super(type, brand);
}
}
public class MiComputer extends Computer {
public MiComputer() {
this.brand="小米";
this.type="笔记本";
}
public MiComputer(String type, String brand) {
super(type, brand);
}
}
复制代码
简单工厂:
public class SimpleFactory {
public Computer createComputer(String name) {
if ("lenovo".equals(name)) {
return new LenovoComputer();
} else if ("mi".equals(name)) {
return new LenovoComputer();
} else if ("hasee".equals(name)) {
return new HaseeComputer();
} else {
return null;
}
}
}
复制代码
客户端:
public class Client {
public static void main(String[] args) {
//简单工厂
SimpleFactory simpleFactory = new SimpleFactory();
Computer mi = simpleFactory.createComputer("mi");
Computer lenovo = simpleFactory.createComputer("lenovo");
Computer hasee = simpleFactory.createComputer("hasee");
System.out.println(mi);
System.out.println(lenovo);
System.out.println(hasee);
}
}
复制代码
2.工厂方法模式
工厂方法对公共的逻辑提取到了公共的父类中,然后每个产品有自己的工厂.不在根据客户端传递参数进行创建,一定程度上避免了出错.
工厂基类:
public interface MethodFactory {
Computer createComputer();
}
复制代码
产品工厂:
public class LeovoMethodFactory implements MethodFactory {
public Computer createComputer() {
return new LenovoComputer();
}
}
复制代码
产品工厂:
public class HaseeMethodFactory implements MethodFactory {
public Computer createComputer() {
return new HaseeComputer();
}
}
复制代码
客户端:
public class Client {
public static void main(String[] args) {
MethodFactory haseeMethodFactory = new HaseeMethodFactory();
Computer hasee = haseeMethodFactory.createComputer();
MethodFactory methodFactory = new LeovoMethodFactory();
Computer lenovo = methodFactory.createComputer();
System.out.println(hasee);
System.out.println(lenovo);
}
}
复制代码
3.抽象工厂
随着产品的丰富,工厂方法的工厂类越来越多(原来只生产笔记本,但是现在各个厂家开始生产台式机了,如果每个都增加一个台式机的工厂,那么工厂类数量会变得很多). 工厂基类:
public interface StaticFactory {
Computer createDesktop();
Computer createNotebook();
}
复制代码
产品工厂:
public class HaseeStaticFactory implements StaticFactory {
public Computer createDesktop() {
HaseeComputer haseeComputer = new HaseeComputer();
haseeComputer.setType("台式机");
haseeComputer.setType("神船");
return haseeComputer;
}
public Computer createNotebook() {
HaseeComputer haseeComputer = new HaseeComputer();
haseeComputer.setType("笔记本");
haseeComputer.setType("神船");
return haseeComputer;
}
}
复制代码
产品工厂:
public class LenovoStaticFactory implements StaticFactory {
public Computer createDesktop() {
LenovoComputer lenovoComputer =new LenovoComputer();
lenovoComputer.setBrand("联想");
lenovoComputer.setType("台式机");
return lenovoComputer;
}
public Computer createNotebook() {
LenovoComputer lenovoComputer =new LenovoComputer();
lenovoComputer.setBrand("联想");
lenovoComputer.setType("笔记本");
return lenovoComputer;
}
}
复制代码
客户端:
public class Client {
public static void main(String[] args) {
StaticFactory haseeStaticFactory = new HaseeStaticFactory();
Computer haseeDesktop = haseeStaticFactory.createDesktop();
Computer haseeNotebook = haseeStaticFactory.createNotebook();
StaticFactory lenovoStaticFactory = new LenovoStaticFactory();
Computer lenovoDesktop = lenovoStaticFactory.createDesktop();
Computer lenovoNotebook = lenovoStaticFactory.createNotebook();
System.out.println(haseeDesktop);
System.out.println(haseeNotebook);
System.out.println(lenovoDesktop);
System.out.println(lenovoNotebook);
}
}
复制代码