「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战」
设计模式的作用
提高代码可复用性、可维护性、可读性、稳健性、安全性。
23种设计模式
创建型模式
单例模式、工厂模式、抽象工厂、建造者模式、原型模式
结构型模式
适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式
行为型模式
模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式
OOP七大原则
开闭原则:对扩展开放、对修改关闭
里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立
依赖倒置原则:要面向接口编程,不要面向实现编程。(细节依赖抽象,抽象不依赖细节)
单一职责原则:控制类的粒度大小,将对象接耦、提高内聚性
接口隔离原则:为各个类建立他们需要的专用接口
迪米特法则:只与朋友沟通,不与陌生人沟通
合成复用原则:尽量先试用组合或聚合等关联关系来实现,其次才考虑继承关系来实现。组合:has a 继承: is a
工厂模式
作用:实现了创建者和调用者分离
分类:简单工厂模式
工厂方法模式
抽象工厂模式
核心本质:实例化对象不使用new,用工厂方式替代。
将调用者与实现者接耦。对象的统一管理和控制。
简单工厂模式
public class SimpleFactory {
// 创建宝马的实例
public static Car getBMW() {
Car bmw = new BMW();
return bmw;
}
// 创建奔驰的实例
public static Car getBenz() {
Car benz = new Benz();
return benz;
}
public static void main(String[] args) {
Car bmw = SimpleFactory.getBMW();
bmw.getBrand();
Car benz = SimpleFactory.getBenz();
benz.getBrand();
}
}
interface Car {
String getBrand();
}
class BMW implements Car {
@Override
public String getBrand() {
System.out.println("品牌为宝马");
return "BMW";
}
}
class Benz implements Car {
@Override
public String getBrand() {
System.out.println("品牌为奔驰");
return "Benz";
}
}
工厂方法模式
public class MethodFactory {
public static void main(String[] args) {
// 我想喝古茗奶茶
GuMingMilkTeaFactory guMingFactory = new GuMingMilkTeaFactory();
MilkTea guMing = guMingFactory.getMilkTea();
guMing.getMilkTea();
// 我想喝茶百道奶茶
ChaBaiDaoMilkTeaFactory chaBaiDaoFactory = new ChaBaiDaoMilkTeaFactory();
MilkTea chaBaiDao = chaBaiDaoFactory.getMilkTea();
chaBaiDao.getMilkTea();
}
}
/**
* 定义一个奶茶工厂
*/
interface MilkTeaFactory {
MilkTea getMilkTea();
}
class GuMingMilkTeaFactory implements MilkTeaFactory {
@Override
public MilkTea getMilkTea() {
return new GuMingMilkTea();
}
}
class ChaBaiDaoMilkTeaFactory implements MilkTeaFactory {
@Override
public MilkTea getMilkTea() {
return new ChaBaiDaoMilkTea();
}
}
interface MilkTea {
void getMilkTea();
}
class GuMingMilkTea implements MilkTea {
@Override
public void getMilkTea() {
System.out.println("古茗奶茶");
}
}
class ChaBaiDaoMilkTea implements MilkTea {
@Override
public void getMilkTea() {
System.out.println("茶百道奶茶");
}
}
抽象工厂模式
public class AbstractFactory {
public static void main(String[] args) {
// 我想喝古茗奶茶
GuMingFactory guMingFactory = new GuMingFactory();
MilkTea guMingMilkTea = guMingFactory.getMilkTea();
guMingMilkTea.getMilkTea();
Juice guMingJuice = guMingFactory.getJuice();
guMingJuice.getJuice();
// 我想喝茶百道奶茶
ChaBaiDaoFactory chaBaiDaoFactory = new ChaBaiDaoFactory();
MilkTea chaBaiDaoMilkTea = chaBaiDaoFactory.getMilkTea();
chaBaiDaoMilkTea.getMilkTea();
Juice chaBaiDaoJuice = chaBaiDaoFactory.getJuice();
chaBaiDaoJuice.getJuice();
}
}
/**
* 定义一个饮品工厂
*/
interface DrinkFactory {
MilkTea getMilkTea();
Juice getJuice();
}
class GuMingFactory implements DrinkFactory {
@Override
public MilkTea getMilkTea() {
return new GuMingMilkTea();
}
@Override
public Juice getJuice() {
return new GuMingJuice();
}
}
class ChaBaiDaoFactory implements DrinkFactory {
@Override
public MilkTea getMilkTea() {
return new ChaBaiDaoMilkTea();
}
@Override
public Juice getJuice() {
return new ChaBaiDaoJuice();
}
}
interface MilkTea {
void getMilkTea();
}
class GuMingMilkTea implements MilkTea {
@Override
public void getMilkTea() {
System.out.println("古茗奶茶");
}
}
class ChaBaiDaoMilkTea implements MilkTea {
@Override
public void getMilkTea() {
System.out.println("茶百道奶茶");
}
}
interface Juice {
void getJuice();
}
class GuMingJuice implements Juice {
@Override
public void getJuice() {
System.out.println("古茗果汁");
}
}
class ChaBaiDaoJuice implements Juice {
@Override
public void getJuice() {
System.out.println("茶百道果汁");
}
}