设计模式-创建型-工厂类

94 阅读3分钟

特性

  • 设计模式特性:
  • 可维护性:不引入新的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();
    }
}

在开发中,常使用简单工厂,若在项目初期明确直到后续业务发展,可使用抽象工厂模式