设计模式

以下所有都是韩顺平老师讲设计模式我个人的笔记而已,如有雷同,就是雷同。

原则:

单一职责:代码不要写到一个类里,比如Controller,Service,Dao。然而也会由另外一个问题Service过重,转而DDD。

依赖倒转:参数中不要放实现类,要放接口,接口尽可能分工明确,只做某一件事。

里氏替换:子类不要重写父类的方法,如果重写了,考虑抽象成接口。 

迪米特法则:类与类之间降低依赖,一个类在另外一个类中的位置可以是1.继承或实现   2.成员变量   3.参数   4.引用jar包,尽可能减少依赖。

模块化和开闭原则:一个jar包可以对外修改,对内不变。

 

模式:

单例模式:比较重的对象,程序中只有一个。比如Spring的示例默认都是单例。推荐使用静态内部类,枚举,双重检查懒汉式。

// 懒汉式(线程安全,同步方法)
class Singleton {
    private static volatile Singleton instance;
    
    private Singleton() {}
    
    //提供一个静态的公有方法,加入双重检查代码,解决线程安全问题, 同时解决懒加载问题
    //同时保证了效率, 推荐使用
    
    public static synchronized Singleton getInstance() {
        if(instance == null) {
            synchronized (Singleton.class) {
                if(instance == null) {
                    instance = new Singleton();
                }
            }
            
        }
        return instance;
    }
}

// 静态内部类完成, 推荐使用
class Singleton {
private static volatile Singleton instance;

//构造器私有化
private Singleton() {}

//写一个静态内部类,该类中有一个静态属性 Singleton
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}

//提供一个静态的公有方法,直接返回SingletonInstance.INSTANCE

public static synchronized Singleton getInstance() {

return SingletonInstance.INSTANCE;
}
}

//使用枚举,可以实现单例, 推荐
enum Singleton {
INSTANCE; //属性
public void sayOK() {
System.out.println("ok~");
}
}
 

 

 

工厂模式:

  需要引用抽象类的地方多了之后,很多个引用对象中就会有很多对应的   判断抽象类的实现是哪个子类   的重复代码。

  简单工厂(静态工厂):1.封装实例化对象的行为 =》引用类的参数中包含了一个一个抽象类,不如包含一个工厂,只需要在工厂中判断是哪个子类。

 

  工厂多了以后,提取一个公共的抽象类,类中定义一个实现方法,所有的子类工厂各自实现它,那为什么不直接定义一个抽象工厂呢?即抽象工厂模式。

  工厂方法:2.把对象实例化行为推迟到子类 =》工厂方法:工厂很多了之后

  

  抽象工厂模式:

//实体类
public class BJCheesePizza extends Pizza {public void prepare() {}}
public class BJPepperPizza extends Pizza {public void prepare() {}}
public class LDCheesePizza extends Pizza{public void prepare() {}}
public class LDPepperPizza extends Pizza{public void prepare() {}}
public abstract class Pizza {public abstract void prepare();}

//抽象工厂
public interface AbsFactory {
    public Pizza createPizza(String orderType);
}

//这是A工厂子类
public class BJFactory implements AbsFactory {

    @Override
    public Pizza createPizza(String orderType) {
        System.out.println("~使用的是抽象工厂模式~");

        Pizza pizza = null;
        if(orderType.equals("cheese")) {
            pizza = new BJCheesePizza();
        } else if (orderType.equals("pepper")){
            pizza = new BJPepperPizza();
        }
        return pizza;
    }

}

//这是B工厂子类
public class LDFactory implements AbsFactory {

    @Override
    public Pizza createPizza(String orderType) {
        System.out.println("~使用的是抽象工厂模式~");
        Pizza pizza = null;
        if (orderType.equals("cheese")) {
            pizza = new LDCheesePizza();
        } else if (orderType.equals("pepper")) {
            pizza = new LDPepperPizza();
        }
        return pizza;
    }

}

//引用方
public class OrderPizza {

    AbsFactory factory;

    // 构造器
    public OrderPizza(AbsFactory factory) {
        setFactory(factory);
    }

    private void setFactory(AbsFactory factory) {
        Pizza pizza = null;
        String orderType = ""; // 用户输入
        this.factory = factory;
        do {
            orderType = getType();
            // TODO factory 可能是北京的工厂子类,也可能是伦敦的工厂子类
            pizza = factory.createPizza(orderType);
            if (pizza != null) { // 订购ok
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            } else {
                System.out.println("订购失败");
                break;
            }
        } while (true);
    }
} 

//调用者 public class PizzaStore { public static void main(String[] args) { //new OrderPizza(new BJFactory()); new OrderPizza(new LDFactory()); } }

 

原型模式:

 

上一篇:第4章 操作列表


下一篇:工厂模式