做者:haibiscuitgit
时间:2019:3:13github
您的star是我不断前行的动力数据库
https://github.com/haibiscuit设计模式
转载请说明出处服务器
前言:框架
1.能够先参考我写的设计原则,总的来讲最重要的是要以单一职责和抽象和接口来设计本身的类,ide
其中单一原则(应该仅有一个引发它变化的缘由),以及模式设计的可扩展性尤其重要。测试
2.为了达到开闭原则,能够将要使用的类的路径配置在xml中,利用反射获取类的实例,另外须要配置的类在每一个模式中只须要配置一种,ui
例如:spa
工厂模式:只须要配置工厂的实现类,目标类(即工厂建立的类在工厂的是喜好呢类中建立)
适配器模式:只须要配置适配器类,适配者在适配器类中建立,由适配器来操做
另外,设计模式是为了创建不一样类型的类之间的关系
例如:
工厂模式的工厂类和目标生成类(这里工厂模式有接口)
适配器模式的适配者类和适配器类(这里适配器类也有接口)
因此,上面的设计模式总结的思路很值得在实际的代码设计中使用
目录:
建立型:(重点推荐工厂模式和单例模式)
1.工厂模式
2.抽象工厂模式
3.单例模式
结构性:(重点推荐适配器模式和代理模式)
1.适配器模式
2.外观模式
3.代理模式
行为型:(重点推荐策略模式和观察者模式)
1.命令模式
2.迭代器模式
3.策略模式
4.观察者模式
一:工厂模式
定义:定义一个用于建立对象的接口,可是让子类决定将哪个类实例化。工厂方法模式让一个子类的实例化延迟到其子类。
使用场景:1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户能够选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个链接服务器的框架,须要三个协议,"POP3"、"IMAP"、"HTTP",能够把这三个做为产品类,共同实现一个接口。
示例:
1.拿日志记录器来举例
//建立的目标类
interface Logger{
void writeLog();
}
class DatabaseLogger implements Logger{
@Override
public void writeLog() {
System.out.println("数据库日志记录类");
}
}
class FileLogger implements Logger{
@Override
public void writeLog() {
System.out.println("文件日志记录类");
}
}
//定义工厂类
interface LoggerFactory{
Logger createLogger();
}
class DatabaseLoggerFactory implements LoggerFactory{
@Override
public Logger createLogger() {
//建立数据库日志记录器类
Logger logger = new DatabaseLogger();
return logger;
}
}
class FileLoggerFactory implements LoggerFactory{
@Override
public Logger createLogger() {
//建立数据库日志记录器类
Logger logger = new FileLogger();
return logger;
}
}
//测试类
class Test{
public static void main(String []args){
LoggerFactory factory;
Logger logger;
factory = new FileLoggerFactory(); //可引入配置文件实现(原理:从配置文件中获取类的路径,再经过反射类建立工厂类,为了实现开闭原则,能够在个人适配器模式中看到思路)
logger = factory.createLogger();
logger.writeLog();
}
}
总结:
1.每次增长一个产品时,都须要增长一个具体类和对象实现工厂,使得系统中类的个数成倍增长,在必定程度上增长了系统的复杂度,同时也增长了系统具体类的依赖。这并非什么好事。