GoF23(23种设计模式)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路,它不是语法规定,而是用来提高代码的可复用性,可维护性,可读性稳健性以及安全性的解决方案。设计模式的本质是面向对象设计原则的实际运用。是对类的封装,继承,多态以及类的关联关系和组合关系的充分理解。可以提高程序员的思维能力,编程能力里和设计能力,使程序设计更加标准化,代码编制更加工程化,提升效率,缩短开发周期。使开发的产品安全性更高,可维护性更强,可用性更高,重点是理解思想与应用场景。
创建性模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式。
结构性模式:适配器模式,桥接模式,代理模式。
行为性模式:观察者模式,职责链模式。
开闭原则:对扩展开放,对修改关闭。
里氏替换原则:继承必须确保父类所拥有的性质在子类中仍然成立,意思:子类中尽量添加新的方法完成新的功能,尽量不要重写父类的方法,少使用多态。
依赖倒置原则:要面向接口编程,不要面向实现编程,细节依赖抽象,而不是抽象依赖细节。
单一职业原则:一个对象不应该承担太多的职业,一个方法尽量做好一件事情就行。
接口隔离原则:要为各个类建立它们需要的专用接口。
迪米特法则:只与你的朋友交谈,不跟陌生人交谈,但是需要增加一些中间类,增加系统的复杂性。
合成复用原则:尽量使用has a等组合关联关系实现,其次考虑is a继承关系来实现。
工厂模式:Factory。创建者和调用者分离:简单工厂模式,工厂方法模式,抽象工厂模式。遵守迪米特法则,开闭原则,依赖倒置原则。实例化对象不使用new,用工厂方法代替。将调用者和实现类进行解耦。让调用者(消费者)不用管底层的实现,直接面向工厂拿对象就行。
用来生产同一等级结构中的任意产品。简单工厂模式虽然满足大部分功能,但如果增加了新的接口的实现类,需要修改静态工厂里面的代码,违反开闭原则。
用来生产同一等级结构中的固定产品。即创建一个工程方法接口(工厂接口里面有一个返回对象的方法),然后给每一个具体的实现类增加一个工厂类,这个工厂类实现工厂接口,然后通过这个实现类的工厂类去拿到相应的对象。但是会增加大量的代码量。
Car接口
package factory.simple;
/**
* @author Clay
*
*/
public interface Car {
void name();
}
Car接口的两个实现类
package factory.simple;
public class BMW implements Car {
@Override
public void name() {
// TODO Auto-generated method stub
System.out.println("BMW");
}
}
package factory.simple;
public class WuLing implements Car {
@Override
public void name() {
// TODO Auto-generated method stub
System.out.println("五菱宏光");
}
}
简单工厂方法:
package factory.simple;
//静态工厂模式,即简单工厂模式
//增加一个新的产品,不修改代码就有点做不到。
//有点违反开闭原则。
public class CarFactory {
//方法一
//假如我们需要增加一个实现Car接口的类,大众,这里需要修改代码,所以可以进行一个优化。
public static Car getCar(String car) {
if(car.equals("WuLing")) {
return new WuLing();
}
else if(car.equals("BMW")){
return new BMW();
}
else
{
return null;
}
//假如我们需要增加一个实现Car接口的类,大众,这里需要修改代码,所以可以进行一个优化。
}
}
静态工厂的测试
package factory.simple;
public class Consumer {
public static void main(String args[]) {
//这是用普通的方式实现的,首先你需要了解接口,然后了解实现类。
//这里我们相当于自己造的new。
Car car = new WuLing();
Car car2 = new BMW();
car.name();
car2.name();
//这里使用工厂来创建
//我无需关心细节,只需要传入一个参数。就能拿到我们想要的对象
Car car3 = CarFactory.getCar("WuLing");
car3.name();
}
}
工厂方法需要增加每个接口实现类的工厂类,该类实现一个工厂接口
工厂接口:
package factory.method;
//工厂方法模式,即解决接口实现类增加的方法。
//需要给每一个实现类增加一个工厂类,实现这个工厂接口
public interface CarFactory {
Car getCar();
}
对应实现类的工厂类
package factory.method;
public class WuLingFactory implements CarFactory {
@Override
public Car getCar() {
// TODO Auto-generated method stub
return new WuLing();
}
}
package factory.method;
public class BWMFactory implements CarFactory {
@Override
public Car getCar() {
// TODO Auto-generated method stub
return new BMW();
}
}
工厂方法的测试
package factory.method;
public class Consumer {
public static void main(String args[]) {
//这是用普通的方式实现的,首先你需要了解接口,然后了解实现类。
//这里我们相当于自己造的new。
Car car = new WuLing();
Car car2 = new BMW();
car.name();
car2.name();
//这里使用工厂来创建
//我无需关心细节,只需要传入一个参数。就能拿到我们想要的对象
//Car car3 = CarFactory.getCar("WuLing");
//car3.name();
//工厂方法模式
Car car3 = new WuLingFactory().getCar();
Car car4 = new BWMFactory().getCar();
car3.name();
car4.name();
}
//结构复杂度:简单工厂
//代码复杂度:简单工厂
//编程复杂度:简单工厂
//管理上的复杂度:简单工厂
//根据设计原则:工厂方法,
//根据实际业务:简单工厂。
}