zoukankan      html  css  js  c++  java
  • 设计模式之简单工厂模式

      工厂模式属于创建型设计模式,它提供了一种创建对象的最佳方式。

      定义通过专门定义一个工厂类来负责创建其它类的对象,而被创建的对象通常都拥有共同的父类或共同的接口。

      问题描述:每当我们要使用到一个类时,通常会先创建这个类的对象然后再使用的,当我们同时创建多个不同类的对象时步骤就得有些繁琐。

      解决方案:定义一个工厂类Factory,专门用于创建其它类(Produce_A和Product_B)的对象,而其它类的对象通常拥有共同的父类或者共同的接口,让工厂类依赖这个父类或接口,这样就将对象的创建和使用分类开来,符合了单一职责原则。

      结构图

         

      举个栗子:讲述一个我养宠物的故事,我养了一条狗,狗喜欢吃骨头,我还养了一只猫,猫喜欢吃鱼。

      情形一:不使用简单工厂模式,按照通常的方式来实现。

      1. 新建一个类Dog,包含一个介绍狗和描述狗喜欢吃骨头的两个方法。代码如下:

             

      2. 新建一个类Cat,包含介绍猫和描述猫喜欢吃鱼的两个方法。代码如下:

             

      3. 在类SimpleFactoryFragment中分别创建狗和猫的对象,然后调用相关方法即可。代码如下:

             

      4. 运行后的效果,如下所示:

             

      情形二:使用简单工厂模式来实现,让狗类Dog和猫类Cat都实现一个共同的接口Animal,接口中封装了狗和猫的公有方法:introduce()和eatFood()。

      1. 新建一个接口Animal,包含介绍introduce()和爱吃的食物eatFood()两个方法。代码如下:

           

      2. 让类Dog和类Cat都实现接口Animal。代码如下:

        

        

      3. 新建一个工厂类AnimalFactory,专门用于创建类Dog和类Cat的对象,通过一个参数来获取需要的对象来实现功能。代码如下:

        

      4. 在类SimpleFactoryFragment中使用该工厂,通过传递类型信息来获取实体类对象来实现功能。代码如下:

            

      4. 运行后的效果同上。

      

      综上所述,简单工厂模式的实质就是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类都拥有一个共同的父类或者接口)的对象。该模式中包含的角色有工厂、抽象产品和具体产品。

      (1)工厂是简单工厂模式的核心,它负责实现创建所有对象实例的内部逻辑。

      (2)抽象产品就是所有创建的对象的父类或接口,它负责描述所有对象实例的公有方法。

      (3)具体产品就是创建的目标对象,它负责实现具体细节。

      优点

      (1)工厂类将对象的创建和使用分离,符合了单一职责原则;

      (2)使用者只需要通过指定的参数在工厂类中拿到相应的具体产品,隐藏了具体产品创建的细节;

      (3)可以在不修改客户端代码的情况下更换或增加新的具体产品类。

      缺点

      (1)工厂类集中了所有具体产品创建的职责,一旦不能使用,那就会导致整个系统不能使用了;

      (2)工厂类是通过传入参数来判断创建哪个产品类对象的,一旦产品类型越来越多,那么就不利于扩展和维护了;

      (3)工厂类使用了静态方法,将无法使用继承结构。

      使用场景:

      (1)产品数量不多,创建逻辑比较简单;

      (2)使用者只想传入参数来获取具体产品对象,对创建细节不关心。

  • 相关阅读:
    开门大吉效果
    Python3-sqlalchemy-orm 创建关联表带外键并插入数据
    Python3-sqlalchemy-orm 联表查询-无外键关系
    Python3-sqlalchemy-orm 分组统计
    Python3-sqlalchemy-orm 回滚
    Python3-sqlalchemy-orm 查询、修改
    Python3-sqlalchemy-orm
    MySQL 5.6的一个bug引发的故障
    MySQL GTID你知多少
    MySQL Cluster 日常维护
  • 原文地址:https://www.cnblogs.com/chenxkang/p/6679957.html
Copyright © 2011-2022 走看看