设计模式学习笔记(5)——工厂模式

版权声明:本文为博主原创,未经博主允许不得转载。 https://blog.csdn.net/weixin_36904568/article/details/89892715

工厂模式:通过工厂,封装创建对象的代码,不需要具体实例化,使用工厂实例化

一:简单工厂

1. 定义

又叫做静态工厂方法模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

2. 使用

一个静态方法通过参数,创建需要的对象

  • 抽象产品类
  • 具体产品类
  • 静态工厂类
  • 业务类
    • 具体业务方法:使用静态工厂生产的产品

(1)产品

package FactoryPattern.SimpleFactoryPattern;

/**
 * 抽象产品
 */
public interface Product {
    public void operate();
}

package FactoryPattern.SimpleFactoryPattern;

/**
 * 具体产品A
 */
public class ProductA implements Product{
    @Override
    public void operate() {
        System.out.println("产品A的业务逻辑");
    }
}

package FactoryPattern.SimpleFactoryPattern;

/**
 * 具体产品B
 */
public class ProductB implements Product{
    @Override
    public void operate() {
        System.out.println("产品B的业务逻辑");
    }
}

(2)静态工厂

package FactoryPattern.SimpleFactoryPattern;

/**
 * 静态工厂
 */
public class Factory {
    public static Product createProduct(String type){
        switch (type) {
            case "A":
                return new ProductA();
            case "B":
                return new ProductB();
            default:
                throw new RuntimeException("not found this type!");
        }
    }
}

(3)测试

package FactoryPattern.SimpleFactoryPattern;

public class Test {
    public static void main(String[] args) {
        Product product = Factory.createProduct("A");
        product.operate();
        product = Factory.createProduct("B");
        product.operate();
        product = Factory.createProduct("C");
        product.operate();
    }
}

3. 特点

  • 当系统引入新的产品的时候无需修改业务方法
  • 工厂类集中了所有的创建逻辑,过于臃肿
  • 无法变更正在创建的对象

二:工厂方法

定义

又叫做虚拟构造子模式或者多态性工厂模式。通过定义创建对象的接口,由子类动态决定实例化,将实际创建工作推迟到子类中。

使用

抽象工厂方法(类的继承)

  • 抽象工厂类
    • 抽象工厂方法:单一产品
  • 具体工厂类
    • 具体工厂方法:创建具体产品
  • 抽象产品类
  • 具体产品类
  • 业务类
    • 具体业务方法:使用抽象工厂类生产的抽象产品

(1)工厂

package FactoryPattern.FactoryFunctionPattern;

/**
 * 抽象工厂
 */
public abstract class Factory {

    public abstract Product createProduct(String type);

}

package FactoryPattern.FactoryFunctionPattern;

/**
 * 具体工厂A——产生A风格的具体产品
 */
public class FactoryA extends Factory {
    @Override
    public Product createProduct(String type) {
        if (type.equals("1"))
            return new ProductA_1();
        else if (type.equals("2"))
            return new ProductA_2();
        else
            throw new RuntimeException("not found this type!");
    }
}

package FactoryPattern.FactoryFunctionPattern;

/**
 * 具体工厂B——产生B风格的具体产品

 */
public class FactoryB extends Factory {
    @Override
    public Product createProduct(String type) {
        if (type.equals("1"))
            return new ProductB_1();
        if (type.equals("2"))
            return new ProductB_2();
        else
            throw new RuntimeException("not found this type!");
    }
}

(2)产品

package FactoryPattern.FactoryFunctionPattern;

/**
 * 抽象产品
 */
public interface Product {
    public void operate();
}

package FactoryPattern.FactoryFunctionPattern;

/**
 * 具体产品A
 */
public class ProductA_1 implements Product {
    @Override
    public void operate() {
        System.out.println("产品A_1的业务逻辑");
    }
}

package FactoryPattern.FactoryFunctionPattern;

/**
 * 具体产品A
 */
public class ProductA_2 implements Product {
    @Override
    public void operate() {
        System.out.println("产品A_2的业务逻辑");
    }
}

package FactoryPattern.FactoryFunctionPattern;

/**
 * 具体产品B
 */
public class ProductB_1 implements Product {
    @Override
    public void operate() {
        System.out.println("产品B_1的业务逻辑");
    }
}

package FactoryPattern.FactoryFunctionPattern;

/**
 * 具体产品B
 */
public class ProductB_2 implements Product {
    @Override
    public void operate() {
        System.out.println("产品B_2的业务逻辑");
    }
}

(3)测试

package FactoryPattern.FactoryFunctionPattern;

public class Test {
    public static void main(String[] args) {
        //使用产品A1的业务
        Factory factory = new FactoryA();
        Product product = factory.createProduct("1");
        product.operate();
        //使用产品B2的业务
        factory = new FactoryB();
        product = factory.createProduct("2");
        product.operate();

    }
}

3. 特点

  • 增加新的产品类型时,系统完全支持“开-闭原则”
  • 允许系统在不修改具体工厂的情况下引进新的产品

三:抽象工厂

1. 定义

抽象工厂模式:提供一个接口,用于创建相关或依赖对象的产品族,不需要明确具体工厂类

  • 产品族:由位于不同产品等级结构中,功能相关联的产品组成的家族
  • 产品等级结构:由相同的结构的产品组成

2. 使用

  • 抽象工厂接口:相关联的产品组合
    • 多个抽象工厂方法:多个产品
  • 具体工厂
    • 多个实现工厂方法
  • 抽象产品类
  • 具体产品类
  • 业务类
    • 具体业务方法:使用抽象工厂接口生产的抽象产品

(1)工厂

package FactoryPattern.AbstractFactoryPattern;

/**
 * 抽象工厂
 */
public interface Factory {

    //产品结构A的产品
    public ProductA createProductA();

    //产品结构B的产品
    public ProductB createProductB();
}

package FactoryPattern.AbstractFactoryPattern;
/**
 * 具体工厂——实现产品族1
 */
public class Factory1 implements Factory {
    @Override
    public ProductA createProductA() {
        return new ProductA_1();
    }

    @Override
    public ProductB createProductB() {
        return new ProductB_1();
    }
}

package FactoryPattern.AbstractFactoryPattern;

/**
 * 具体工厂——实现产品族2
 */
public class Factory2 implements Factory {
    @Override
    public ProductA createProductA() {
        return new ProductA_2();
    }

    @Override
    public ProductB createProductB() {
        return new ProductB_2();
    }
}

(2)产品

package FactoryPattern.AbstractFactoryPattern;

/**
 * 抽象产品
 */
public interface Product {
    public void operate();
}

package FactoryPattern.AbstractFactoryPattern;

/**
 * 具体产品A
 */
public interface ProductA extends Product {

    public void operateA();
}

package FactoryPattern.AbstractFactoryPattern;

/**
 * 具体产品B
 */
public interface ProductB extends Product {

    public void operateB();
}

package FactoryPattern.AbstractFactoryPattern;

import FactoryPattern.FactoryFunctionPattern.Product;

/**
 * 具体产品A
 */
public class ProductA_1 implements ProductA {
    @Override
    public void operate() {
        System.out.println("产品A_1的基本功能");
    }

    @Override
    public void operateA() {
        System.out.println("产品A_1的特别功能");
    }
}

package FactoryPattern.AbstractFactoryPattern;

import FactoryPattern.FactoryFunctionPattern.Product;

/**
 * 具体产品A
 */
public class ProductA_2 implements ProductA {
    @Override
    public void operate() {
        System.out.println("产品A_2的基本功能");
    }

    @Override
    public void operateA() {
        System.out.println("产品A_2的特别功能");
    }
}

package FactoryPattern.AbstractFactoryPattern;

import FactoryPattern.FactoryFunctionPattern.Product;

/**
 * 具体产品B
 */
public class ProductB_1 implements ProductB {
    @Override
    public void operate() {
        System.out.println("产品B_1的基本功能");
    }

    @Override
    public void operateB() {
        System.out.println("产品B_1的特别功能");
    }
}

package FactoryPattern.AbstractFactoryPattern;

import FactoryPattern.FactoryFunctionPattern.Product;

/**
 * 具体产品B
 */
public class ProductB_2 implements ProductB {
    @Override
    public void operate() {
        System.out.println("产品B_2的基本功能");
    }

    @Override
    public void operateB() {
        System.out.println("产品B_2的特别功能");
    }
}

(3)测试

package FactoryPattern.AbstractFactoryPattern;

public class Test {
    public static void main(String[] args) {
        //组装第1组的产品
        Factory factory1 = new Factory1();
        ProductA a = factory1.createProductA();
        ProductB b = factory1.createProductB();
        a.operateA();
        b.operateB();
        //组装第2组的产品
        Factory factory2 = new Factory2();
        a = factory2.createProductA();
        b = factory2.createProductB();
        a.operateA();
        b.operateB();

    }
}

3. 特点

  • 系统的产品有多于一个的产品族,而系统只需要其中某一族的产品
  • 起到了一定的约束作用,同属于同一个产品族的产品必须配套使用
  • 切换产品族的时候,只要提供不同的抽象工厂实现就可以
  • 不太容易扩展新的产品,需要修改抽象工厂

猜你喜欢

转载自blog.csdn.net/weixin_36904568/article/details/89892715