常见的设计模式
一、设计模式的概念
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(); } }

浙公网安备 33010602011771号