笨蛋学设计模式创建者模式-工厂模式【3】

创建者模式-工厂模式

    • 6.2工厂模式:arrow_up::arrow_up::arrow_up:
      • 6.2.1概念
      • 6.2.2场景
      • 6.2.3优势 / 劣势
      • 6.2.4工厂模式分为
      • 6.2.5工厂模式
      • 6.2.6实战
        • 6.2.6.1题目描述
        • 6.2.6.2输入描述
        • 6.2.6.3输出描述
        • 6.2.6.4代码
      • 6.2.7总结
      • 简单工厂
      • 方法工厂


6.2工厂模式⬆️⬆️⬆️

6.2.1概念

​ 工厂模式提供了一种创建对象的接口,但具体创建的对象类型可以在运行时决定。工厂模式创建对象时不会对调用者暴露创建细节,而是通过将创建对象的详细过程封装起来,只需要与调用者进行交互,就能获取需要的对象。

6.2.2场景

​ 当我们去餐馆吃饭时,我们只需要告诉服务员在菜单中想吃的菜,服务员就会将菜单安排给后厨人员为我们准备菜肴,但是我们作为顾客并不知道后厨是如何制作菜肴的,也就是后厨人员制菜的过程封装起来了,而我们只会看到服务员上到餐桌上的菜肴,也就是我们所需要获取的对象。

6.2.3优势 / 劣势

  • 降低耦合度:将对象的创建和使用分离,即使调用者不知道创建对象,也能调用对象,降低耦合度

  • 提高可维护性:将对象的创建和使用过程进行解耦,使得代码更加模块化以及可复用性

  • 屏蔽具体实现:不需要知道对象的创建过程,屏蔽了具体的实现过程对调用者的影响


  • 不符合单一职责原则:会集中大量对象的创建逻辑,导致工厂类职责过重,违反了单一职责原则

  • 增加系统复杂度:工厂模式需要定义工厂类,增加了系统的类数和复杂性,导致工厂类变得复杂

6.2.4工厂模式分为

  • 抽象产品:定义产品的接口
  • 具体产品:实现抽象产品接口,是工厂创建的对象
  • 抽象工厂:一个接口,包含一个抽象的工厂方法(用于创建产品对象)
  • 具体工厂:实现抽象接口,创建具体的产品

6.2.5工厂模式

package com.designpattern.mode.factory;

public class Factory {
    public static void main(String[] args) {
        CircleFactory circleFactory = new CircleFactory();
        Shape circle = circleFactory.createShape();
        circle.draw();

        SquareFactory squareFactory = new SquareFactory();
        Shape square = squareFactory.createShape();
        square.draw();
        
    }
}

//抽象产品
interface Shape{
    void draw();
}

//具体产品-圆形
class Circle implements Shape{

    @Override
    public void draw() {
        System.out.println("Circle");
    }
}


//具体产品-正方形
class Square implements Shape{

    @Override
    public void draw() {
        System.out.println("Square");
    }
}

//抽象工厂
interface ShapeFactory{
    Shape createShape();
}

//具体工厂-创建圆形
class CircleFactory implements ShapeFactory{

    @Override
    public Shape createShape() {
        return new Circle();
    }
}

//具体工厂-创建正方形
class SquareFactory implements ShapeFactory{

    @Override
    public Shape createShape() {
        return new Square();
    }
}

6.2.6实战

6.2.6.1题目描述

小明家有两个工厂,一个用于生产圆形积木,一个用于生产方形积木,请你帮他设计一个积木工厂系统,记录积木生产的信息。

6.2.6.2输入描述

输入的第一行是一个整数 N(1 ≤ N ≤ 100),表示生产的次数。

接下来的 N 行,每行输入一个字符串和一个整数,字符串表示积木的类型。积木类型分为 “Circle” 和 “Square” 两种。整数表示该积木生产的数量

6.2.6.3输出描述

对于每个积木,输出一行字符串表示该积木的信息。

6.2.6.4代码
package com.designpattern.mode.factory;


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Test {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        //创建积木工厂系统
        BlockFactorySystem factorySystem = new BlockFactorySystem();

        //获取积木数量
        int productionCount = scanner.nextInt();
        scanner.nextLine();

        //读取生产的积木类型和数量
        for(int i=0;i<productionCount;i++){
            //分隔空格,取出类型和数量
            String[] productionInfo = scanner.nextLine().split(" ");

            String blockType = productionInfo[0];
            int blockNums = Integer.parseInt(productionInfo[1]);
            
            if(blockType.equals("CircleBlock")){
                factorySystem.BuildBlocks(new CircleBlockFactory(),blockNums);
            }else if(blockType.equals("SquareBlock")){
                factorySystem.BuildBlocks(new SquareBlockFactory(),blockNums);
            }
        }
    }
}

//抽象积木接口
interface Block{
    //生产积木方法
    void makeBlock();
}

//具体圆形积木实现
class CircleBuildBlock implements Block {

    //圆形积木生产方法
    @Override
    public void makeBlock() {
        System.out.println("CircleBlock");
    }
}
//具体正方形积木实现
class SquareBuildBlock implements Block{
    //正方形积木生产方法
    @Override
    public void makeBlock() {
        System.out.println("SquareBlock");
    }
}

//抽象积木工厂
interface BlockFactory{
    //制造积木的工厂
    Block createBlock();
}

//具体圆形积木工厂
class CircleBlockFactory implements BlockFactory{
    @Override
    public Block createBlock() {
        return new CircleBuildBlock();
    }
}

//具体正方形积木工厂
class SquareBlockFactory implements BlockFactory{

    @Override
    public Block createBlock() {
        return new SquareBuildBlock();
    }
}

//积木工厂系统
class BlockFactorySystem{
    //定义list存放积木信息
    private List<Block> blocks=new ArrayList<>();

    //参数为具体积木工厂和积木数量
    public void BuildBlocks(BlockFactory factory,int nums){
        for(int i=0;i<nums;i++){
            Block block = factory.createBlock();
            blocks.add(block);
            block.makeBlock();
        }
    }
}

6.2.7总结

  • 简单工厂

优点:由于简单工厂模式只依赖于产品的接口,添加新产品时就只需要增加相应的实现类和工厂类

总结:根据参数的不同返回不同类的实例

场景:适用于单一产品的情况

  • 方法工厂

优点:通过调用工厂对象的方法来创建产品对象,因此增加新产品时只需要增加相应的工厂方法

总结:调用工厂对象的方法来创建产品对象的工厂模式

场景:适用于需要创建多种相关对象的情况

你可能感兴趣的:(笨蛋学设计模式,设计模式,java,简单工厂模式)