常见的设计模式

一、设计模式的概念

1、定义

Java包含23种设计模式,是一套对代码设计经验的总结,一种代码的设计方式;为了提高代码的可读性,可扩展性以及代码的复用性,解决项目中代码设计的问题

2、遵循原则

开闭原则:对外扩展开放,对修改关闭(对代码少修改)

里氏替换原则:面向对象基本原则之一,任何父类出现的地方,子类都可以出现,也是子类可以替换父类的任何功能(体现父类的扩展性)

依赖倒转原则:尽可能面向接口编程,依赖接口不依赖类

接口隔离原则:一个类如果能实现多个接口,尽可能实现多个,为了降低依赖,降低耦合

最少知道原则:一个实体尽可能少的与其他实体产生相互关联关系,将实体的功能独立

合成复用原则:尽量使用合成,聚合的方式而不使用继承

二、设计模式的分类

 

 

三、常见的几种设计模式

单例模式:

单例模式是创建对象的一种特殊的方式,程序从始至终都只创建一个对象叫单例

懒汉式单例

public class Person{
//为了不让其他类直接访问该成员 懒汉式单例,在使用时创建对象
//1、私有静态变量
private static Person person=null;
//2、将构造器私有化
private Person(){

}
//3、提供一个静态方法,并返回该类的对象
public static Person getInstance(){
if(person==null){
//第一次访问
person=new Person();;
}
return person;
}
public void sayHello(){
System.out.println("sayHello方法");
}
}

 饿汉式单例

public class Student {
    //1、 饿汉式单例模式,  在类加载时创建一个对象
    private static Student student = new Student();

    // 2 构造器私有化
    private Student(){

    }
    // 3 提供返回类对象的静态方法
    public static Student getInstance(){
        if(student !=null){
            return student;
        }
         return null;
    }
}

工厂模式

创建对象的过程不再由当前类实例化,而是由工厂类完成,在工厂类中只需要告知对象类型即可。工厂模式中必须依赖接口

简单工厂模式

简单工厂模式一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例,需要修改代码进行扩展。

//电脑接口
public interface Computer {
    //电脑办公
    public void work();
}
//笔记本
public class PersonComputer implements  Computer{

    @Override
    public void work() {
        System.out.println("这是笔记本电脑,正在办公");
    }
}
//一体机
public class WorkComputer implements  Computer{

    @Override
    public void work() {
        System.out.println("这是一体机正在办公");
    }
}
//用于生产电脑的工厂 (这个工厂既可以生产台式机也可以生产笔记本)
public class ComputerFactory {

    /**
     * 根据不同的类型 生产不同的产品
     * @param type
     * @return
     */
    public Computer produce(String type){
        Computer computer =null;
        if(type.equals("personComputer")){
            computer = new PersonComputer();
        }else if(type.equals("workComputer")){
            computer = new WorkComputer();
        }else{
            System.out.println("不能生产");
        }
        return computer;
    }
//静态工厂方法模式
public class ComputerFactory2 {
    /**
     *  静态工厂方法
     * @param type
     * @return
     */
    public static Computer produce(String type){
        // 定义一个接口的引用    通过接口new 一个实现类的对象
        // 提高扩展性
        Computer computer=null;
         if(type.equals("workComputer")){
             computer = new WorkComputer();
         }else if(type.equals("personComputer")){
             computer = new PersonComputer();
         }else{
             System.out.println("不能创建对象");
         }
         return computer;
    }
}
//测试类
public class Test1 {
 public static void main(String[] args) {
         // 通过工厂类创建对象
        ComputerFactory factory = new ComputerFactory();
        // 要对象 找工厂
        Computer computer1 = factory.produce("workComputer");
        computer1.work();
        // 创建笔记本
        Computer computer2 = factory.produce("personComputer");
        computer2.work();

        Computer computer3 = ComputerFactory2.produce("workComputer");
        computer3.work();
 }
}

工厂方法模式

工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品。

//汽车接口
public interface Car {
    public void  showInfo();
}
public class AudiCar implements Car {
    @Override
    public void showInfo() {
        System.out.println("这是一台奥迪汽车。。");
    }
}
public class BMWCar implements Car {
    @Override
    public void showInfo() {
        System.out.println("这是一台宝马汽车。");
    }
}
/**
生产汽车的工厂接口
**/
public interface CarFactory {
    public Car produce();
}
public class AudiCarFactory implements  CarFactory {
    @Override
    public Car produce() {

        return  new AudiCar();// 这里AudiCar是Car的实现类
    }
}
public class BMWCarFactory implements CarFactory {
    @Override
    public Car produce() {
        return new BMWCar();// 因为BWMCar是Car的实现类
    }
}
public class Test1 {
        public static void main(String[] args) {
            //先创建 汽车工厂
            CarFactory bmwFactory = new BMWCarFactory();
            // 这个工厂生产的汽车就是 宝马
            Car bmw = bmwFactory.produce();
            bmw.showInfo();
    
            //这个模式对于同一级别的产品,可扩展性高
            //可以扩展不同品牌的汽车,此时不需要修改代码,只需要增加代码即可
            // 创建一个新的品牌汽车  大众汽车
    
            CarFactory dazhongFactory = new DazhongCarFactory();
            Car car = dazhongFactory.produce();
            car.showInfo();
        }
    }

抽象工厂

 对于在工厂方法的基础上,对同一个品牌的产品有不同的分类,并对分类产品创建的过程 ,一个汽车产品 会分为不同的种类(迷你汽车 ,SUV汽车 )

/**
 * 迷你汽车接口
 */
public interface MiniCar {
    public void showInfo();
}
/**
 * SUV汽车接口
 */
public interface SUVCar {
    public void showInfo();

}
public class AudiMiniCar implements  MiniCar {
    @Override
    public void showInfo() {
        System.out.println("这是奥迪迷你汽车 ");
    }
}
public class BMWMiniCar implements  MiniCar {
    @Override
    public void showInfo() {
        System.out.println("这是宝马Cooper迷你汽车");
    }
}
public class AudiSUVCar implements  SUVCar {
    @Override
    public void showInfo() {
        System.out.println("这是一辆 奥迪SUV汽车");
    }
}
public class BMWSUVCar implements  SUVCar {
    @Override
    public void showInfo() {
        System.out.println("这宝马的SUV系列");
    }
}
public interface CarFactory {
    //生成不同型号的汽车 ,两条产品线
    public MiniCar produceMiniCar();

    public SUVCar produceSUVCar();
}
public class AudiCarFactory implements  CarFactory {
    @Override
    public MiniCar produceMiniCar() {
        return new AudiMiniCar();
    }

    @Override
    public SUVCar produceSUVCar() {
        return new AudiSUVCar();
    }
}
public class BMWCarFactory implements  CarFactory {
    // 生成迷你汽车的方法,返回MiniCar
    @Override
    public MiniCar produceMiniCar() {
        return new BMWMiniCar();
    }
    //生成SUV汽车的方法, 返回SUVCar
    @Override
    public SUVCar produceSUVCar() {
        return new BMWSUVCar();
    }
}
/**
 * 测试类
 */
public class Test1 {
    public static void main(String[] args) {
        //创建宝马迷你汽车  找工厂
        CarFactory factory = new BMWCarFactory();
        MiniCar car = factory.produceMiniCar();
        car.showInfo();
    }
}

对于简单工厂:用于生产同一结构的任意产品,对于新增产品就得修改工厂类

对于工厂方法:在简单的工厂基础上,生产统一等级结构的产品,可以新增产品

对于抽象工厂:工厂里面嵌套工厂,用于生产不同品牌的相同类型,对于新增品牌可以

模板方法

​ 模板方法是一种行为模式,父类的一个方法定义完成这个方法的步骤,但不具体实现具体细节,由子类完成各个步骤的实现,在创建子类对象时,最终实现过程是子类的方法。

public abstract class AbstractPerson {
    /**
     *  定义一个模板方法,用于实现这个方法的基本“骨架”
     *  每一步骤的具体实现由子类完成
     */
    public void preparedSchool(){
        getUp();
        dressing();
        eat();
    }
    //起床
    public abstract void getUp();
    //穿衣服
    public abstract void dressing();
    //吃早餐
    public abstract void eat();
}
public class Student extends AbstractPerson {
    @Override
    public void getUp() {
        System.out.println("学生起床,起不来,闹钟响3次");
    }

    @Override
    public void dressing() {
        System.out.println("学生穿衣服,找不到衣服");

    }

    @Override
    public void eat() {
        System.out.println("学生吃早餐,来不及吃早餐");

    }
}
public class Teacher extends  AbstractPerson {
    @Override
    public void getUp() {
        System.out.println("老师起床,7点半起床");
    }

    @Override
    public void dressing() {
        System.out.println("老师要衣服得体,穿工装");
    }

    @Override
    public void eat() {
        System.out.println("老师吃早餐。");
    }
}
public class Test1 {
    public static void main(String[] args) {
          Student stu = new Student();
          stu.preparedSchool();

          Teacher teacher = new Teacher();
          teacher.preparedSchool();

    }
}

 

posted @ 2022-03-20 15:50  起眠  阅读(66)  评论(0)    收藏  举报