设计模式-简单工厂模式

137 阅读4分钟

所有博客的初衷都是为了自我提升。

简单工厂模式

定义

简单工厂模式又叫静态方法模式(这是因为简单工厂模式里面的工厂类定义了一个静态方法),可以看作是一个负责生产对象的类。

解决什么问题呢?

主要是将“类实例化的操作”与“使用对象的操作”分开,作为使用者只需要往工厂类的静态方法中传入一个参数,就可以基于参数值不同生产对应的具体产品。这样使用者就不需要显示的去实例化类的操作,实现了解耦。

模式组成

使用步骤

  • 1.创建抽象的产品类,定义好具体产品的公共接口
  • 2.创建具体的产品类,继承抽象的产品类,定义生产的具体产品
  • 3.创建工厂类,通过创建静态方法根据不同的参数值,从而创建对应的具体产品类的实例
  • 4.外界只需要调用工厂类的静态方法,传入相应参数值就可以获得对应的具体产品类实例。

实例

具体代码实现如下:

步骤1 创建抽象产品类

abstract class Product{
    public abstract void Show();
}

步骤2. 创建具体产品类(继承抽象产品类),定义生产的具体产品


//具体产品类A
class  ProductA extends  Product{

    @Override
    public void Show() {
        System.out.println("生产出了产品A");
    }
}

//具体产品类B
class  ProductB extends  Product{

    @Override
    public void Show() {
        System.out.println("生产出了产品B");
    }
}

//具体产品类C
class  ProductC extends  Product{

    @Override
    public void Show() {
        System.out.println("生产出了产品C");
    }
}

步骤3.创建工厂类,通过创建静态方法从而根据传入不同参数创建不同具体产品类的实例

class  Factory {
    public static Product Manufacture(String ProductName){
//工厂类里用switch语句控制生产哪种商品;
//使用者只需要调用工厂类的静态方法就可以实现产品类的实例化。
        switch (ProductName){
            case "A":
                return new ProductA();

            case "B":
                return new ProductB();

            case "C":
                return new ProductC();

            default:
                return null;

        }
    }
}

步骤4. 外界通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例

//工厂产品生产流程
public class SimpleFactoryPattern {
    public static void main(String[] args){
        //客户要产品A
        try {
//调用工厂类的静态方法 & 传入不同参数从而创建产品实例
            Factory.Manufacture("A").Show();
        }catch (NullPointerException e){
            System.out.println("没有这一类产品");
        }

        //客户要产品B
        try {
            Factory.Manufacture("B").Show();
        }catch (NullPointerException e){
            System.out.println("没有这一类产品");
        }

        //客户要产品C
        try {
            Factory.Manufacture("C").Show();
        }catch (NullPointerException e){
            System.out.println("没有这一类产品");
        }

        //客户要产品D
        try {
            Factory.Manufacture("D").Show();
        }catch (NullPointerException e){
            System.out.println("没有这一类产品");
        }
    }
}
------------------------
输出
生产出了产品A
生产出了产品C
生产出了产品C
没有这一类产品

优点

  • 1.将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;
  • 2.把初始化实例时的工作放到工厂里进行,使代码更容易维护。 更符合面向对象的原则 & 面向接口编程,而不是面向实现编程。

缺点

  • 1.我觉得最主要是的是违背了“开放-关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
  • 2.工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
  • 3.简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。

应用场景

  • 1.客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时;
  • 2.当工厂类负责创建的对象(具体产品)比较少时。

总结

这篇文章主要参考 简单工厂模式,其实内容差不多,之所以自己还再写,一是为了自我学习,二是里面有细节不完全对,这也是为了日后自己学习而准备。