模式设计之创建对象:简单工厂模式

简单工厂模式的定义

简单工厂模式又叫静态工厂模式,在简单工厂模式中,可以根据不同的参数返回不同的实例,被创建的实例通常都有共同的接口。

 

UML图

 

IProduct:接口。简单工厂模式所创建的所有对象的接口,它负责描述所有实例要实现的公共接口。

Prouduct:具体子类,是简单工厂模式的创建目标,可以有多种。

Factory:工厂类,简单工厂模式的核心,它负责根据逻辑需求,创建所有实例。createProduct方法可以被外界直接调用,创建所需的实例。

 

示例:

  1. 有一个工厂,生产产品Product。
  2. 最近推出了3个产品ProductA/B/C,使用简单工厂模式实现3款产品的生产。

产品接口

interface Product{
    void Show();
}

3款产品

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

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

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

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

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

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

简单工厂类:

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;

        }
    }
}
根据用户需求生成不同类型产品
//工厂产品生产流程
public class SimpleFactoryPattern {
    public static void main(String[] args){
        Factory mFactory = new Factory();

        //客户要产品A
        try {
           //调用工厂类的静态方法 & 传入不同参数从而创建产品实例
            mFactory.Manufacture("A").Show();
        }catch (NullPointerException e){
            System.out.println("没有这一类产品");
        }

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

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

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

输出结果

生产出了产品A
生产出了产品C
生产出了产品C
没有这一类产品

 

优缺点

优点

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

缺点

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

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章