码迷,mamicode.com
首页 > 其他好文 > 详细

工厂方法模式

时间:2020-12-08 12:39:34      阅读:4      评论:0      收藏:0      [点我收藏+]

标签:说话   get   att   factor   数据   demo   连接   hal   rac   

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***\n");
        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. 要注意的问题是创建太多的对象影响性能

思考

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

工厂方法模式

标签:说话   get   att   factor   数据   demo   连接   hal   rac   

原文地址:https://www.cnblogs.com/mouseGo/p/14083686.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!