创建型模式:工厂 Factory

创建型模式:关注如何创建对象。隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。(将不同的类分开,如果一个Computer内的Printer想改为BetterPrinter,则需要修改Computer源码。使Computer创建时,传入Printer类型,使分离。开闭原则。)
工厂:建立实例时,向工厂“输入信息”。在工厂类中,选择超类和多个子类之一实现。对象的实例创建由工厂代替new。
tips:超类可以是接口、抽象类、父类。
解决问题:接口选择问题。

创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。

创建型模式在创建什么(What),由谁创建(Who),何时创建(When)等方面都为软件设计者提供了尽可能大的灵活性。

创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。


一、介绍

https://blog.csdn.net/weixin_34262482/article/details/91417686?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase


二、实现

1.简单工厂模式(静态工厂模式,违背开闭原则,抽象、具体的产品、具体工厂)


// 计算类的基类
public abstract class Operation {
 
    private double value1 = 0;
    private double value2 = 0;
 
    public double getValue1() {
        return value1;
    }
    public void setValue1(double value1) {
        this.value1 = value1;
    }
    public double getValue2() {
        return value2;
    }
    public void setValue2(double value2) {
        this.value2 = value2;
    }
    protected abstract double getResule();
}
 
//加法
public class OperationAdd extends Operation {
    @Override
    protected double getResule() {
        return getValue1() + getValue2();
    }
}
//减法
public class OperationSub extends Operation {
    @Override
    protected double getResule() {
        return getValue1() - getValue2();
    }
}
//乘法
public class OperationMul extends Operation {
    @Override
    protected double getResule() {
        return getValue1() * getValue2();
    }
}
//除法
public class OperationDiv extends Operation {
    @Override
    protected double getResule() {
        if (getValue2() != 0) {
            return getValue1() / getValue2();
        }
        throw new IllegalArgumentException("除数不能为零");
    }
}

//工厂类
public class OperationFactory {
 
    public static Operation createOperation(String operation) {
        Operation oper = null;
        switch (operation) {
            case "+":
                oper = new OperationAdd();
                break;
            case "-":
                oper = new OperationSub();
                break;
            case "*":
                oper = new OperationMul();
                break;
 
            case "/":
                oper = new OperationDiv();
                break;
            default:
                throw new UnsupportedOperationException("不支持该操作");
        }
        return oper;
    }
}

//使用工厂类
Operation operationAdd = OperationFactory.createOperation("+");
operationAdd.setValue1(10);
operationAdd.setValue2(5);
System.out.println(operationAdd.getResule());

一个万能的大工厂,可生产各种产品。如增加新产品,需要修改大工厂内部代码,不符合开闭原则。


2.工厂方法模式(抽象、具体的产品、工厂)

工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”
工厂方法模式和简单工厂模式虽然都是通过工厂来创建对象,他们之间最大的不同是——工厂方法模式在设计上完全完全符合“开闭原则”。

//将OperationFactory修改:

//工厂接口,抽象父类
public interface IFactory {
    Operation CreateOption();
}
 
//加法类工厂
public class AddFactory implements IFactory {
    public Operation CreateOption() {
        return new OperationAdd();
    }
}
 
//除法类工厂
public class DivFactory implements IFactory {
    public Operation CreateOption() {
        return new OperationDiv();
    }
}
 
//除法类工厂
public class MulFactory implements IFactory {
    public Operation CreateOption() {
        return new OperationMul();
    }
}
 
//减法类工厂
public class SubFactory implements IFactory {
    public Operation CreateOption() {
        return new OperationSub();
    }
}

将万能的大工厂,用抽象父类和每种产品对应的一个工厂来替代,一个工厂负责一种产品。新产品,新建产品类后,新修一个工厂便是,不用修改原来的工厂内部代码,符合开闭原则。
工厂方法模式又被称为多态工厂模式,是因为所有的具体工厂类都具有同一抽象父类。

工厂方法模式的主要优点是增加新的产品类时无须修改现有系统,并封装了产品对象的创建细节,系统具有良好的灵活性和可扩展性;其缺点在于增加新产品的同时需要增加新的工厂,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性。


3.抽象工厂模式(抽象、具体的产品、工厂)根据不同的分类方式

开闭原则倾斜性支持,倾斜于产品族,而非单个产品(大种类)。

提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
抽象工厂模式将同一产品族的单独的工厂封装起来。使用中,客户端程序创建抽象工厂的具体实现,使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。
抽象工厂模式的一个工厂可以创建属于一类类型的多种具体产品。工厂创建产品的个数介于简单工厂模式和工厂方法模式之间。

//抽象产品
public interface BenzCar {
    //加汽油
    public void gasUp();
 
}
 
public interface TeslaCar {
    //充电
    public void charge();
}

//具体产品

public class BenzSportCar implements BenzCar {
    public void gasUp() {
        System.out.println("给我的奔驰跑车加最好的汽油");
    }
}
 
public class BenzBusinessCar implements BenzCar{
    public void gasUp() {
        System.out.println("给我的奔驰商务车加一般的汽油");
    }
}
 
public class TeslaSportCar implements TeslaCar {
    public void charge() {
        System.out.println("给我特斯拉跑车冲满电");
    }
}
 
public class TeslaBusinessCar implements TeslaCar {
    public void charge() {
        System.out.println("不用给我特斯拉商务车冲满电");
    }
}

//抽象工厂
public interface CarFactory {
 
    public BenzCar getBenzCar();
    public TeslaCar getTeslaCar();
}

//具体工厂

public class SportCarFactory implements CarFactory {
    public BenzCar getBenzCar() {
        return new BenzSportCar();
    }
 
    public TeslaCar getTeslaCar() {
        return new TeslaSportCar();
    }
}
 
public class BusinessCarFactory implements CarFactory {
    public BenzCar getBenzCar() {
        return new BenzBusinessCar();
    }
 
    public TeslaCar getTeslaCar() {
        return new TeslaBusinessCar();
    }
}

抽象工厂模式的主要优点是隔离了具体类的生成,使得客户并不需要知道什么被创建,而且每次可以通过具体工厂类创建一个产品族中的多个对象,增加或者替换产品族比较方便,增加新的具体工厂和产品族很方便;主要缺点在于增加新的产品等级结构(大种类)很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。


4.实现对比

  • 简单工厂模式:
    1.抽象产品:所有产品的共性。
    2.具体产品:新增时,新加产品类。
    3.具体工厂:大工厂,生产所有种类产品。新增产品时,需要对大工厂内部代码修改。

  • 工厂方法模式:
    1.抽象产品:所有产品共性。
    2.具体产品:新增时,新加产品类。
    3.抽象工厂:所有工厂共性(如生产一个产品)。
    4.具体工厂:每个产品对应一个具体工厂。新增时,新增一个具体工厂便可。

  • 抽象工厂模式:即根据产品的不同类型、分类方式
    1.抽象产品:不同大种类。
    2.具体产品:依据产品族,将每个大种类分类为每种具体产品
    3.抽象工厂:不同大种类。
    4.具体工厂:根据产品族创建,根据产品族,在内部确定每个大种类对应的产品族中的具体产品。增加产品族时,创建新的工厂。增加新产品时,抽象工厂和具体工厂都要修改。

简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,主要是新增产品,就要修改工厂类。符合单一职责原则。不符合开放-封闭原则)

工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品,新增产品时不需要更改已有的工厂,需要增加该产品对应的工厂。符合单一职责原则、符合开放-封闭原则。但是引入了复杂性)

抽象工厂 :用来生产不同产品族的全部产品。(增加新产品时,需要修改工厂,增加产品族时,需要增加工厂。符合单一职责原则,部分符合开放-封闭原则,降低了复杂性)

你可能感兴趣的:(创建型模式:工厂 Factory)