美文网首页
设计模式学习笔记(四)工厂模式之抽象工厂模式

设计模式学习笔记(四)工厂模式之抽象工厂模式

作者: Link913 | 来源:发表于2017-05-31 16:04 被阅读134次

    定义

    抽象工厂模式提供一个接口,用于创建相关依赖对象的家族,而不需要明确指定具体类.

    优点与缺点

    优点:抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有 的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
      另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。


    缺点:在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)

    个人理解

    抽象工厂主要用来生产一个产品族,抽象工厂的方法很多情况下都是由抽象工厂实现的,抽象工厂会实现一组产品的创建接口,每一个接口都会创建一个产品.下文的demo中PizzaIngredientFactory作为原料工厂的基类为各个地区的PizzaStore提供原料来生产Pizza,PizzaIngredientFactory会生产面团,沙司,芝士,蔬菜等一系列产品族.很多地方其实是由工厂模式方法实现的.

    文件结构

    demo链接
    总体来说和工厂模式方法的结构差不多,不同的是增加了PizzaIngredientFactory这个原料抽象类和两个根据地区不同而创建的原料具体类.

    PizzaIngredientFactory抽象类头文件

    每一个接口都会生产一个对象,这里为了省事,所以用NSString代替这个生产对象.NYPizzaIngredientFactoryChicagoPizzaIngredientFactory都继承自抽象类,根据地区的差别生产不同的原料对象.

        #import <Foundation/Foundation.h>
    
    
        @interface PizzaIngredientFactory : NSObject
    
        /**
         面团
         */
        - (NSString *)createDough;
    
        /**
         沙司
         */
        - (NSString *)createSauce;
    
        /**
         创建芝士
         */
        - (NSString *)createCheese;
    
        /**
         创建蔬菜
         */
        - (NSString *)createVeggies;
    
        @end
    

    PizzaIngredientFactory抽象类实现文件

        #import "PizzaIngredientFactory.h"
    
        @implementation PizzaIngredientFactory
    
        - (NSString *)createDough{
            return @"普通面团";
        }
    
        - (NSString *)createSauce{
            return @"普通沙司";
        }
    
        - (NSString *)createCheese{
            return @"普通芝士";
        }
    
        - (NSString *)createVeggies{
            return @"普通蔬菜";
        }
        @end
    

    NYPizzaIngredientFactory抽象类实现文件

    NYPizzaIngredientFactory继承自PizzaIngredientFactory,只是对部分生产接口进行了覆写.

        #import "NYPizzaIngredientFactory.h"
    
        @implementation NYPizzaIngredientFactory
    
        - (NSString *)createSauce{
            return @"纽约风味沙司";
        }
    
        - (NSString *)createVeggies{
            return @"纽约风味蔬菜";
        }
    
        @end
    

    Pizza类基类的改动

    头文件中声明了我们当在Store的时候就会给Pizza赋予一个原料工厂,Pizza的原料产品族准备依赖这个原料工厂.

         /**
         披萨原料工厂
         */
        @property (nonatomic, strong) PizzaIngredientFactory *ingredientFactory;
        #import "Pizza.h"
    

    实现文件

        @interface Pizza ()
    
        @property (nonatomic, copy) NSString *douth;
        @property (nonatomic, copy) NSString *sauce;
        @property (nonatomic, copy) NSString *cheese;
        @property (nonatomic, copy) NSString *veggies;
    
        @end
    
        @implementation Pizza
    
        - (instancetype)prepare{
            NSLog(@"开始原味pizza准备");
            NSLog(@"准备了%@,%@,%@,%@",_douth,_sauce,_cheese,_veggies);
            return self;
        }
    
        - (void)setIngredientFactory:(PizzaIngredientFactory *)ingredientFactory{
            _ingredientFactory = ingredientFactory;
            _douth = [ingredientFactory createDough];
            _sauce = [ingredientFactory createSauce];
            _cheese = [ingredientFactory createCheese];
            _veggies = [ingredientFactory createVeggies];
        }
        @end
    

    Pizza工厂的调用

    这是纽约披萨工厂的调用,芝加哥工厂也是类似的.
    - (Pizza *)createPizzaWithPizzaType:(PizzaType)pizzaType{
    Pizza *pizza;
    switch (pizzaType) {
    case cheesePizza:
    pizza = [NYCheesePizza new];
    break;
    case pepperoniPizza:
    pizza = [NYPepperoniPizza new];
    break;
    default:
    pizza = [Pizza new];
    break;
    }
    pizza.ingredientFactory = [NYPizzaIngredientFactory new];
    return pizza;
    }

    相关文章

      网友评论

          本文标题:设计模式学习笔记(四)工厂模式之抽象工厂模式

          本文链接:https://www.haomeiwen.com/subject/dkqzxxtx.html