ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式

2021-08-23 15:03:15  阅读:190  来源: 互联网

标签:Singleton public pizza 工厂 设计模式 class Pizza


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

原则:

单一职责:代码不要写到一个类里,比如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()); } }

 

原型模式:

 

标签:Singleton,public,pizza,工厂,设计模式,class,Pizza
来源: https://www.cnblogs.com/yuan66/p/15175871.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有