作者:haibiscuit
时间:2019:3:13
您的star是我不断前行的动力
https://github.com/haibiscuit
转载请说明出处
前言:
1.可以先参考我写的设计原则,总的来说最重要的是要以单一职责和抽象和接口来设计自己的类,
其中单一原则(应该仅有一个引起它变化的原因),以及模式设计的可扩展性尤为重要。
2.为了达到开闭原则,可以将要使用的类的路径配置在xml中,利用反射获取类的实例,另外需要配置的类在每个模式中只需要配置一种,
例如:
工厂模式:只需要配置工厂的实现类,目标类(即工厂创建的类在工厂的是喜爱呢类中创建)
适配器模式:只需要配置适配器类,适配者在适配器类中创建,由适配器来操作
另外,设计模式是为了建立不同类型的类之间的关系
例如:
工厂模式的工厂类和目标生成类(这里工厂模式有接口)
适配器模式的适配者类和适配器类(这里适配器类也有接口)
所以,上面的设计模式总结的思路很值得在实际的代码设计中使用
目录:
创建型:(重点推荐工厂模式和单例模式)
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.每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。