【软考】设计模式之抽象工厂模式

1. 说明
  • 1.提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
  • 2.抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式。
  • 3.抽象工厂模式用于系统的产品族,而不仅仅是一个等级结构;一个等级的抽象类只能创建一个等级的产品,而抽象工厂模式能创建多个等级的产品。
2. 应用场景
  • 1.当一个系统不应当依赖于产品类实例如何被创建、组合和表示的细节时。
  • 2.当系统中有多于一个的产品族,而每次只使用其中某一产品族时。
  • 3.属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
  • 4.系统提供一个产品类的库,并希望系统的设计独立于这些产品的实现时。
3. 结构图

在这里插入图片描述

4. 构成
  • 1.抽象工厂(Abstract Factory):声明一个创建产品对象的接口,但由子类决定要实例化的产品是哪一个。工厂方法通常返回该产品的抽象类型。
  • 2.具体工厂(Concrete Factory):实现了抽象工厂接口的具体类,负责实例化产品对象。
  • 3.抽象产品(Abstract Product):为每种产品声明接口,在抽象产品中定义了产品的抽象方法。
  • 4.具体产品(Concrete Product):实现了抽象产品接口的具体类。
5. 适用性
  • 1.一个系统要独立于它的产品的创建、组合和表示时。
  • 2.一个系统要由多个产品系列中的一个来配置时。
  • 3.当要强调一系列相关的产品对象的设计以便进行联合使用时。
  • 4.当提供一个产品类库,只想显示它们的接口而不是实现时。
6. 优点
  • 1.抽象工厂模式隔离了具体类的生成,使得客户不需要知道什么被创建。
  • 2.增加一个新的产品族很方便,无需修改已有系统,符合开闭原则。
7. 缺点
  • 1.增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
  • 2.使用抽象工厂模式会增加系统中类的个数,在一定程度上增加了系统的复杂度和理解难度。
8. java示例
  • 1.抽象产品 食物
package com.learning.factory.abstract_factory.example;

/**
 * 抽象产品:食物
 */

public interface Food {  
    void prepare();
} 
  • 2.抽象产品 饮料
package com.learning.factory.abstract_factory.example;

/**
 * 抽象产品:饮料
 */
public interface Drink {  
    void serve();  
}
  • 3.具体产品 中餐食物
package com.learning.factory.abstract_factory.example;

/**
 * 具体产品:中餐食物
 */
public class ChineseFood implements Food {  
    @Override  
    public void prepare() {  
        System.out.println("准备中餐食物");
    }  
} 
  • 4.具体产品 中餐饮料
package com.learning.factory.abstract_factory.example;

/**
 * 具体产品:中餐饮料
 */

public class ChineseDrink implements Drink {  
    @Override  
    public void serve() {  
        System.out.println("供应中餐饮料");
    }  
} 
  • 5.具体产品 西餐食物
package com.learning.factory.abstract_factory.example;

/**
 * 具体产品:西餐食物
 */
public class WesternFood implements Food {  
    @Override  
    public void prepare() {  
        System.out.println("准备西餐食物");
    }  
}  
  • 6.具体产品 西餐饮料
package com.learning.factory.abstract_factory.example;

/**
 * 具体产品:西餐饮料
  */
public class WesternDrink implements Drink {  
    @Override  
    public void serve() {  
        System.out.println("供应西餐饮料");
    }  
}
  • 7.抽象工厂
package com.learning.factory.abstract_factory.example;

/**
 * 抽象工厂
 */
public interface RestaurantFactory {
    /**
     * 创建食物
     * @return
     */
    Food createFood();

    /**
     * 创建饮料
     * @return
     */
    Drink createDrink();  
}  
  • 8.具体工厂 中餐工厂
package com.learning.factory.abstract_factory.example;

/**
 * 具体工厂:中餐工厂
  */
public class ChineseRestaurantFactory implements RestaurantFactory {  
    @Override  
    public Food createFood() {  
        return new ChineseFood();  
    }  
  
    @Override  
    public Drink createDrink() {  
        return new ChineseDrink();  
    }  
} 
  • 9.具体工厂 西餐工厂
package com.learning.factory.abstract_factory.example;

/**
 * 具体工厂:西餐工厂
 */
public class WesternRestaurantFactory implements RestaurantFactory {  
    @Override  
    public Food createFood() {  
        return new WesternFood();  
    }  
  
    @Override  
    public Drink createDrink() {  
        return new WesternDrink();  
    }  
}
  • 10.客户端
package com.learning.factory.abstract_factory.example;

/**
 * 客户端
 */
public class RestaurantClient {
    public static void main(String[] args) {  
        // 使用中餐工厂  
        RestaurantFactory chineseFactory = new ChineseRestaurantFactory();  
        Food chineseFood = chineseFactory.createFood();  
        chineseFood.prepare();  
  
        Drink chineseDrink = chineseFactory.createDrink();  
        chineseDrink.serve();  
  
        // 使用西餐工厂  
        RestaurantFactory westernFactory = new WesternRestaurantFactory();  
        Food westernFood = westernFactory.createFood();  
        westernFood.prepare();  
  
        Drink westernDrink = westernFactory.createDrink();  
        westernDrink.serve();  
    }  
}
  • 11.示例截图
    在这里插入图片描述
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王佑辉

老板,赏点吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值