工厂方法模式

Posted mousego

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂方法模式相关的知识,希望对你有一定的参考价值。

Factory Method Patterns

GoF定义:定义一个接口来创建它的对象,但是由子类(实现类)来决定到底实例化哪个类。工厂方法使得类的实例化过程推迟到子类(而不是直接实例化一个类)

概念

用事实说话【滑稽】

例子

现实世界:假设你有两种电视,一种是LED屏幕,一种是LCD屏幕,当它们出现故障时,修理工人首先会问是哪类屏幕的电视出了故障,根据你的回答,他会采取不同的修理方法
代码世界:如果有两个数据库实例,一个是Oracle,一个是SQLserver,那么当我们要与数据库交互时,我们需要创建一个连接。如果用if-else的形式来创建,既不美观,也会重复写很多代码。我们可以使用工厂模式来解决这类问题i。基本的代码结构定义在抽象类中,子类会负责实例化过程

展示

技术图片

代码

public class FactoryMethodPatternEx
{
    public static void main(String[] args) throws Exception
    {
        System.out.println("***Factory Pattern Demo***
");
        IAnimalFactory animalFactory = new ConcreteFactory();
        IAnimal DuckType=animalFactory.getIAnimalType("Duck");
        DuckType.speak();
        IAnimal TigerType = animalFactory.getIAnimalType("Tiger");
        TigerType.speak();
        //There is no Lion type. So, an exception will be thrown
        IAnimal LionType = animalFactory.getIAnimalType("Lion");
        LionType.speak();
    }
}

interface IAnimal {
    void speak();
}

class Duck implements IAnimal {
    @Override
    public void speak()
    {
        System.out.println("Duck says Pack-pack");
    }
}

class Tiger implements IAnimal {
    @Override
    public void speak()
    {
        System.out.println("Tiger says: Halum..Halum");
    }
}

abstract class IAnimalFactory {
    public abstract IAnimal getIAnimalType(String type) throws Exception;
}

class ConcreteFactory extends IAnimalFactory {
    @Override
    public IAnimal getIAnimalType(String type) throws Exception
    {
        switch (type)
        {
            case "Duck":
                return new Duck();
            case "Tiger":
                return new Tiger();
            default:
                throw new Exception("Animal type " + type + " not exists!");
        }
    }
}

Note

  1. 当我们要把实例化的过程放到子类中去实现时使用这个模式
  2. 实现平行类层级的时候可以使用这种模式(松耦合系统)
  3. 要注意的问题是创建太多的对象影响性能

思考

工厂方法确实很常用,我个人认为这个模式的核心在于工厂类创建出来的对象必须要符合同一个接口(必要条件)。例子中工厂也写了一个抽象类的情况,应该是工厂类比较多的情况下需要,而且作为专职创建对象的类,感觉没有太多的东西可以继续做抽象


以上是关于工厂方法模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式-简单工厂工厂方法模式抽象工厂模式详解

工厂方法模式

设计模式-工厂方法模式(Go实现)

C++工厂模式(简单工厂工厂方法抽象工厂)

C++工厂模式(简单工厂工厂方法抽象工厂)

设计模式---工厂模式