特性
- 设计模式特性:
- 可维护性:不引入新的bug情况下,快速新增和修改。
- 灵活性:能快速集成到代码中。
- 可拓展性:对修改关闭,对拓展开放。
- 可读性:易于别人理解。
- 可复用性:可减少代码编写。
- 简洁性:简单易懂。
- 可测试性。
设计原则:
单一职责:设计的内容粒度小,一个操作控制一个动作(一个接口控制一种实现) 判断标准:属性量的多少;依赖类的数量(只对需要的做依赖);私有方法量;方法尽量不要只对其中几个属性做操作
开闭原则⭐:定义的内容是模板,实现时不能更改模板,而是在模板上做拓展。
里氏替换:在多态背景下,接口/方法能接收的参数可以为所有实现了的类;能够根据接口知道相关实现类要做什么。
接口隔离:接口中的方法根据重要性做分离,避免实现时不必要的功能完成;通过实现多个接口完成实际操作。 减少代码冗余;减少粒度,体现层次;
依赖倒置:提供中间层抽象类,上层与下层内容依赖中间层。手机为上层,电话卡槽为抽象层,电话卡可替换为下层。 做到解耦
迪米特:有关系的类采用合适的内容做联系,没有关系的老死不相往来。
设计模式是设计原则的实现。
工厂模式
创建型
简单工厂
更像是一种编程思想,将对象创建和具体实现分开,根据参数,由工厂决定创建哪个对象。
缺点:有新业务创建的时候,需要修改工厂中的判断逻辑,不满足开闭原则。
public interface Detail{
void createSomething(String name);
}
class Machine implements Detail {
@Override
public void createSomething(String str){
// 业务处理
System.out.println("做了什么事情");
}
}
class Robot implements Detail {
@Override
public void createSomething(String str){
// 业务处理
System.out.println("做了什么事情");
}
}
class MyFactory {
public static Detail createInstance (Integer type) {
Detail detail = null;
// 有新的模块时,需要增加if判断
if(type == 1) {
detail = new Machine();
}else if(type == 2){
detail = new Robot();
}
return detail;
}
}
class Test {
public void create(){
Detail instance = MyFactory.createInstance(1);
String str = "业务中需要的参数";
instance.createSomething(str);
}
}
工厂方法
工厂方法中,将对象的创建交给具体的实现类,做到专人专项。做到遵守开闭原则。
每创建一个实现类都需要一个对应的工厂方法,造成代码复杂。
工厂方法中包括:工厂抽象类、工厂实现类、具体产品、产品抽象
// 工厂抽象接口定义相关内容,由工厂实现类实现并完成方法重写。
// 方法重写返回值为对应产品,具体产品实现产品抽象接口。
class ProductAFactory implements ProductFactory{
@Override
public Product create(){
return new ProductA();
}
}
interface ProductFactory{
Product create();
}
class ProductA implements Product{
@Override
public void use(){
System.out.println("使用神奇的方式创建了对象");
}
}
interface Product{
void use();
}
抽象工厂
自己描述:抽象工厂模式通过定义一个‘品牌工厂’接口,让我们可以通过具体品牌(如海尔工厂)来统一创建该品牌下的一系列商品(如电视、冰箱、洗衣机),从而实现产品族的一致性和解耦。
白话:提供一系列相关或相互依赖的产品对象的创建接口,而不指定具体类
interface Product {}
class ProductA implements Product{}
interface Company{
Product createA();
}
class CompanyA implements Company{
@Override
public Product create(){
return new ProductA();
}
}
class TestDemo{
Product pro;
// get,set
public TestDemo(Company coms){
this.pro = coms.create();
}
public static void main(String[] str){
TestDemo td = new TestDemo(new CompanyA);
Product pro = td.getPro();
}
}
在开发中,常使用简单工厂,若在项目初期明确直到后续业务发展,可使用抽象工厂模式