网上相关设计模式的文章确实有很多,自己也是根据这些技术大牛的总结在逐渐的学习,相关的技术文章写的确实不错,不过为了加深自己的理解,遂决定还是自己动手,学习的比较深刻一点。个人理解学习就是这样的,总是看着别人的东西,觉着很简单,等到自己实际操作的时候,就不是那么回事。我的前辈和我说过,计算机语言本身并不重要,学习他的目的就是为了解决实际生活中遇到的问题,刚开始并部明白这句话的真正含义,只是为了学习而学习,为了工作而工作。慢慢接触久了就发现,当自己处于不同的高度时,看待问题的角度也发生了变化。
1.普通工厂模式:
public interface Car {
public abstract void getBrand();
}
public class Audi implements Car{
public void getBrand() {
System.out.println("brand is Audi");
}
}
public class Benzi implements Car {
@Override
public void getBrand() {
System.out.println("bradn is Benzi");
}
}
public class Factory {
private static final String AUDI = "audi";
private static final String BENZI = "benzi";
public Car getCar(String carType){
if(AUDI.equals(carType)){
return new Audi();
}else if(BENZI.equals(carType)){
return new Benzi();
}else {
return null;
}
}
}
public class main {
public static void main(String[] args) {
Factory factory = new Factory();
Car audi = factory.getCar("audi");
Car benzi = factory.getCar("benzi");
benzi.getBrand();;
audi.getBrand();
}
}
应用场景:当需要创建多个类型的对象(例如:需要创建奥迪车,和奔驰车对象),并且这些对象有类似的功能(都拥有自己的品牌,即getBrand()方法),可以把这些对象进行抽象(奥迪车和奔驰车抽象成“Car”),当需要从工厂中获取指定类型的对象(获取奥迪车或者奔驰车对象),并执行对象的方法(getBrand()方法)。
LG:我想从汽车工厂中,获取奔驰车的对象,并且通过对象得到奔驰车的品牌是什么。
带着下面的几个问题我们在了解一下真正的使用目的
“工厂模式”顾名思义,在工厂之中生产对象,工厂中产生的对象在生产之后一定是具体的(非抽象的)
如何得到具体的对象实例?以上代码时通过传入的参数是:“audi”或者“benzi”来获取真正的汽车对象。
为什么我们要实现Car的接口?根据java设计模式的6种设计理念。
分别是:
1.开闭原则:对扩展开发,对修改关闭
2.依赖倒转原则:基于开闭原则,针对于接口编程,依赖于抽象,不依赖于具体
3.里氏代换原则:任何父类出现的方法子类一定出现
4.接口隔离原则:尽量实现多个接口,充分的解耦和
5.迪米特法则:也是最少知道原则,尽量减少多个类之间的互相调用关系,使得系统功能模块相对独立
6.合成复用原则:尽量使用合成/具体的方式,避免使用继承
以下摘抄:
Ø 开放-封闭原则:对扩展开放,对修改封闭,可以用新的类来解决问题
Ø 单一职责原则:设计目的单一的类。也就是降低程序的耦和程度
Ø 李氏替换原则:用子类去替代父类
Ø 依赖倒置原则:依赖于抽象,而不依赖于具体的实现;针对接口编程,不针对实现编程
Ø 接口隔离原则:使用多个接口总比使用单个接口要好
Ø 组合重用原则:尽量使用组合,而不是使用继承来达到重用的目的,因为继承是一种紧偶和
Ø 最少知道原则:一个对象应当对其他对象有尽可能少的了解,即信息隐蔽
在设计之初,我们可能想到两种车都有相同的方法(getBrand()方法),但是方法中的具体实现,是根据具体的对象类型决定的,所以我们将对象进行抽象,实现了Car的接口;
一下是个人对Java中接口的理解:
1.接口是一种规范
2.如果多个对象或方法需要进行抽象时,可以通过实现接口,此时接口的作用是把对象或者方法进行了纵向抽象
3.功能的横向扩展:通过实现接口,将类中的方法进行增强,这种横向扩展的理解比较强硬,起始横向扩展的理解和第一中“接口是一种规范”理解的角度不同,横向扩展在装饰设计模式和适配器模式中可以有相应的体现。
第一次写难免有些片面,和理解方面的不足,希望自己通过不断的学习和知识的积累,把更好的东西呈现出来