设计模式汇总

单例模式.
工厂模式.
工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。本文从一个具体的例子逐步深入分析,来体会三种工厂模式的应用场景和利弊。

  1. 简单工厂模式**(一个产品,一个工厂)**
    该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象。①写一个接口,然后有多个实现;②写一个工厂类(只有一个工厂),里面有方法根据传入的字符串,return new xxxx();返回一个NEW对象,注意是在工厂里NEW对象。③简单工厂也叫静态工厂,故此方法是static的

  2. 工厂方法模式(Factory Method)(一个产品,多个工厂)
    和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂
    设计模式汇总_第1张图片
    工厂方法模式中:①2个接口,一个是产品的,一个是加工该产品的工厂②对于产品和加工厂都有多个实现类③这里生产产品是通过对应的工厂来生产对应的产品,对应的工厂下return new xxxx();④简单工厂只有一个工厂,生产所有的产品,此工厂方法模式有多个工厂,对应生产不同的产品,使用时调用不同的工厂即可。

  3. 抽象工厂模式(Abstract Factory)(多个产品,多个工厂)
    上面两种模式不管工厂怎么拆分抽象,都只是针对一类产品Phone(AbstractProduct),如果要生成另一种产品PC,应该怎么表示呢?
    抽象工厂模式通过在AbstarctFactory中增加创建产品的接口,并在具体子工厂中实现新加产品的创建,当然前提是子工厂支持生产该产品。否则继承的这个接口可以什么也不干。
    设计模式汇总_第2张图片
    以此图为例:①手机产品接口、路由器产品接口、工厂接口一个②手机接口实现为小米和华为③路由器接口实现为小米和华为④工厂实现为小米和华为工厂 ⑤小米/华为工厂生产自己的手机和路由器。

装饰者模式总结1.
装饰者模式总结2.
装饰者模式总结3.
装饰者模式:
定义
不改变原有对象的基础之上,将功能附加到对象上。提供了比继承更有弹性的替代方案(扩展原有对象功能)
类型
结构型

适用场景
扩展一个类的功能或者给一个类添加附加职责
给一个对象动态的添加功能,或动态撤销功能。

优点3个
继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能。继承在扩展功能是静态的,必须在编译时就确定好,而使用装饰者可以在运行时决定,装饰者也建立在继承的基础之上的!!!
通过使用不同装饰类以及这些类的排列组合,可以实现不同的效果。
符合开闭原则
缺点
会出现更多的代码,更多的类,增加程序的复杂性。
动态装饰时,多层装饰时会更复杂。(使用继承来拓展功能会增加类的数量,使用装饰者模式不会像继承那样增加那么多类的数量但是会增加对象的数量,当对象的数量增加到一定的级别时,无疑会大大增加我们代码调试的难度)
写代码注意的几点:
1.基类声明为抽象,在里面写一些方法。
2.其他子类继承该抽象父类,因为是抽象类,所以子类实现其方法。
3.装饰父类要继承该抽象父类,同时创建抽象父类的实例化对象,在装饰类构造函数中传入该对象。采用this关键字
4.在其他装饰子类中,继承装饰父类,同时也将抽象父类的实例化对象,在装饰子类类构造函数中传入该对象。采用super关键字

Builder构造者模式.
介绍:
构造者模式,又称之为建造者模式,建造者模式,单例模式以及工厂模式都属于创建型模式
1应用场景
今天学mybatis的时候,知道了SQLSessionFactory使用的是builder模式来生成的。再次整理一下什么是builder模式以及应用场景。
当一个bean类重载了多个构造方法时,并且参数随机使用时,考虑使用构造者模式,
builder模式也叫建造者模式,builder模式的作用将一个复杂对象的构建与他的表示分离,使用者可以一步一步的构建一个比较复杂的对象。链式编程
其中mybatis中Environment.java也是构造者模式

/**
 *    Copyright 2009-2019 the original author or authors.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package org.apache.ibatis.mapping;

import javax.sql.DataSource;

import org.apache.ibatis.transaction.TransactionFactory;

/**
 * @author Clinton Begin
 */
public final class Environment {
     
  private final String id;
  private final TransactionFactory transactionFactory;
  private final DataSource dataSource;

  public Environment(String id, TransactionFactory transactionFactory, DataSource dataSource) {
     
    if (id == null) {
     
      throw new IllegalArgumentException("Parameter 'id' must not be null");
    }
    if (transactionFactory == null) {
     
      throw new IllegalArgumentException("Parameter 'transactionFactory' must not be null");
    }
    this.id = id;
    if (dataSource == null) {
     
      throw new IllegalArgumentException("Parameter 'dataSource' must not be null");
    }
    this.transactionFactory = transactionFactory;
    this.dataSource = dataSource;
  }

  public static class Builder {
     
    private final String id;
    private TransactionFactory transactionFactory;
    private DataSource dataSource;

    public Builder(String id) {
     
      this.id = id;
    }

    public Builder transactionFactory(TransactionFactory transactionFactory) {
     
      this.transactionFactory = transactionFactory;
      return this;
    }

    public Builder dataSource(DataSource dataSource) {
     
      this.dataSource = dataSource;
      return this;
    }

    public String id() {
     
      return this.id;
    }

    public Environment build() {
     
      return new Environment(this.id, this.transactionFactory, this.dataSource);
    }

  }

  public String getId() {
     
    return this.id;
  }

  public TransactionFactory getTransactionFactory() {
     
    return this.transactionFactory;
  }

  public DataSource getDataSource() {
     
    return this.dataSource;
  }

}
++++++++++++++++++++++++++++++++++++
XmlConfigBuilder.java 文件中部分代码:
Environment.Builder environmentBuilder = new Environment.Builder(id)
              .transactionFactory(txFactory)
              .dataSource(dataSource);
          configuration.setEnvironment(environmentBuilder.build());

你可能感兴趣的:(JAVA)