本文最后更新于 352 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
工厂模式&装饰模式
1.工厂模式
1.1 工厂模式概述
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的方式。之前我们创建类对象时, 都是使用new 对象的形式创建, 除new 对象方式以外, 工厂模式也可以创建对象。
1.2 工厂模式作用
解决类与类之间的耦合问题
1.3 工厂模式实现步骤
- 编写一个Car接口, 提供run方法
- 编写一个Falali类实现Car接口,重写run方法
- 编写一个Benchi类实现Car接口
- 提供一个CarFactory(汽车工厂),用于生产汽车对象
- 定义CarFactoryTest测试汽车工厂
1.4 工厂模式实现代码
1.编写一个Car接口, 提供run方法
public interface Car {
public void run();
}
2.编写一个Falali类实现Car接口,重写run方法
public class Falali implements Car {
@Override
public void run() {
System.out.println("法拉利以每小时500公里的速度在奔跑.....");
}
}
3.编写一个Benchi类实现Car接口
public class Benchi implements Car {
@Override
public void run() {
System.out.println("奔驰汽车以每秒1米的速度在挪动.....");
}
}
4.提供一个CarFactory(汽车工厂),用于生产汽车对象
public class CarFactory {
/**
* @param id : 车的标识
* benchi : 代表需要创建Benchi类对象
* falali : 代表需要创建Falali类对象
* 如果传入的车标识不正确,代表当前工厂生成不了当前车对象,则返回null
* @return
*/
public Car createCar(String id){
if("falali".equals(id)){
return new Falali();
}else if("benchi".equals(id)){
return new Benchi();
}
return null;
}
}
5.定义CarFactoryTest测试汽车工厂
public class CarFactoryTest {
public static void main(String[] args) {
CarFactory carFactory = new CarFactory();
Car benchi = carFactory.createCar("benchi");
benchi.run();
Car falali = carFactory.createCar("falali");
falali.run();
}
}
1.5 工厂模式小结
工厂模式的存在可以改变创建类的方式,解决类与类之间的耦合.
实现步骤:
- 编写一个Car接口, 提供run方法
- 编写一个Falali类实现Car接口,重写run方法
- 编写一个Benchi类实现Car接口
- 提供一个CarFactory(汽车工厂),用于生产汽车对象
- 定义CarFactoryTest测试汽车工厂
2.装饰设计模式
在我们所学的缓冲流中涉及到java的一种设计模式,叫做装饰模式。
1.1 装饰模式概述
装饰模式指的是在不改变原类, 不使用继承的基础上,动态地扩展一个对象的功能。
1.2 案例演示
准备环境
- 编写一个Star接口, 提供sing 和 dance抽象方法
- 编写一个LiuDeHua类,实现Star接口,重写抽象方法
public interface Star {
public void sing();
public void dance();
}
public class LiuDeHua implements Star {
@Override
public void sing() {
System.out.println("刘德华在唱忘情水...");
}
@Override
public void dance() {
System.out.println("刘德华在跳街舞...");
}
}
需求
在不改变原类的基础上对LiuDeHua类的sing方法进行扩展
实现步骤
- 编写一个LiuDeHuaWarpper类, 实现Star接口,重写抽象方法
- 提供LiuDeHuaWarpper类的有参构造, 传入LiuDeHua类对象
- 在LiuDeHuaWarpper类中对需要增强的sing方法进行增强
- 在LiuDeHuaWarpper类对不需要增强的方法调用LiuDeHua类中的同名方法
实现代码
LiuDeHua类: 被装饰类。
LiuDeHuaWarpper类: 我们称之为装饰类。
/*
装饰模式遵循原则:
装饰类和被装饰类必须实现相同的接口
在装饰类中必须传入被装饰类的引用
在装饰类中对需要扩展的方法进行扩展
在装饰类中对不需要扩展的方法调用被装饰类中的同名方法
*/
public class LiuDeHuaWarpper implements Star {
// 存放被装饰类的引用
private LiuDeHua liuDeHua;
// 通过构造器传入被装饰类对象
public LiuDeHuaWarpper(LiuDeHua liuDeHua){
this.liuDeHua = liuDeHua;
}
@Override
public void sing() {
// 对需要扩展的方法进行扩展增强
System.out.println("刘德华在鸟巢的舞台上演唱忘情水.");
}
@Override
public void dance() {
// 不需要增强的方法调用被装饰类中的同名方法
liuDeHua.dance();
}
}
测试结果
public static void main(String[] args) {
// 创建被装饰类对象
LiuDeHua liuDeHua = new LiuDeHua();
// 创建装饰类对象,被传入被装饰类
LiuDeHuaWarpper liuDeHuaWarpper = new LiuDeHuaWarpper(liuDeHua);
// 调用装饰类的相关方法,完成方法扩展
liuDeHuaWarpper.sing();
liuDeHuaWarpper.dance();
}
1.3 装饰模式小结
装饰模式可以在不改变原类的基础上对类中的方法进行扩展增强,实现原则为:
- 装饰类和被装饰类必须实现相同的接口
- 在装饰类中必须传入被装饰类的引用
- 在装饰类中对需要扩展的方法进行扩展
- 在装饰类中对不需要扩展的方法调用被装饰类中的同名方法