抽象工厂模式是向客户端提供一个接口(FruitFactory),,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族(NorthFruit、SouthFruit)的产品对象。

角色和职责:

1.抽象工厂(factory)-FruitFactory:

抽象工厂模式的核心,包含对多个产品接口的说明,任何工厂类都必须实现这个接口

2.具体工厂(concrete factory)-NorthFruitFactory、SouthFruitFactory:

负责实例化某个产品族(比如apple,apple的产品族是NorthApple、SouthApple)中的产品对象

3.抽象产品(product)-Apple、Banana:

抽象模式所创建的所有对象的父类,它负责所有实例所共有的公共接口

4.具体产品(concrete product)-NorthApple、SouthApple、NorthBanana、SouthBanana:

UML图:

具体代码:

/**
* 水果接口
*/
public interface Fruit {
void pick();
}
/**
* 抽象苹果类
*/
public abstract class Apple implements Fruit{
public abstract void pick();
}
/**
* 抽象香蕉类
*/
public abstract class Banana implements Fruit{
public abstract void pick();
}
/**
* 北方苹果
*/
public class NorthApple extends Apple{
@Override
public void pick() {
System.out.println("采摘北方苹果");
}
}
/**
* 采摘北方香蕉
*/
public class NorthBanana extends Banana{
@Override
public void pick() {
System.out.println("采摘北方香蕉");
}
}
/**
* 南方苹果
*/
public class SouthApple extends Apple{
@Override
public void pick() {
System.out.println("采摘南方苹果");
}
}
/**
* 南方香蕉
*/
public class SouthBanana extends Banana{
@Override
public void pick() {
System.out.println("采摘南方香蕉");
}
}
/**
* 水果工厂接口
*/
public interface FruitFactory {
Fruit getApple();
Fruit getBanana();
}
/**
* 北方水果工厂
*/
public class NorthFruitFactory implements FruitFactory {
@Override
public Fruit getApple() {
return new NorthApple();
} @Override
public Fruit getBanana() {
return new NorthBanana();
}
}
/**
* 南方水果工厂
*/
public class SouthFruitFactory implements FruitFactory{
@Override
public Fruit getApple() {
return new SouthApple();
} @Override
public Fruit getBanana() {
return new SouthBanana();
}
}
public class Main {
public static void main(String[] args) {
FruitFactory northFruitFactory = new NorthFruitFactory();//北方水果工厂
Fruit northApple = northFruitFactory.getApple();//生产苹果
northApple.pick();
Fruit northBanana = northFruitFactory.getBanana();//生产香蕉
northBanana.pick(); FruitFactory southFruitFactory = new SouthFruitFactory();//南方水果工厂
Fruit southApple = southFruitFactory.getApple();//生产苹果
southApple.pick();
Fruit southBanana = southFruitFactory.getBanana();//生产香蕉
southBanana.pick();
}
}

结果:

采摘北方苹果
采摘北方香蕉
采摘南方苹果
采摘南方香蕉

优缺点:

优:

  • 抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建
  • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象
  • 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

缺:增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性

应用场景:

抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。

应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。

源码:https://github.com/qjm201000/design_pattern_abstractFactory.git

设计模式-抽象工厂模式(AbstractFactory)的更多相关文章

  1. 设计模式-抽象工厂模式(AbstractFactory)(创建型模式)

    //以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Product.h #pragma once class AbstractProductA { public: vir ...

  2. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  3. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. 设计模式——抽象工厂模式(AbstractFactoryPattern)

    抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. UML图: IFactory: package com.cnblog.clarck ...

  5. JAVA设计模式--抽象工厂模式

    抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...

  6. 深入浅出设计模式——抽象工厂模式(Abstract Factory)

    模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...

  7. 设计模式 | 抽象工厂模式(abstract factory)

    定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 结构:(书中图,侵删) 这个图相对来说有一点点复杂,其实就是在工厂方法模式的基础上做了一些扩展,工厂方法模式只用于生成一种 ...

  8. 设计模式--抽象工厂模式C++实现

    抽象工厂模式C++实现 1定义 为创建一组相关或者依赖的对象提供一个接口,且无需指定他们的具体类 2类图 3实现 class AbstractProduct { protected: Abstract ...

  9. C#设计模式——抽象工厂模式(Abstract Factory Pattern)

    一.概述在软件开发中,常常会需要创建一系列相互依赖的对象,同时,由于需求的变化,往往存在较多系列对象的创建工作.如果采用常规的创建方法(new),会造成客户程序和对象创建工作的紧耦合.对此,抽象工厂模 ...

随机推荐

  1. WPF中StringFormat的用法

    原文:WPF中StringFormat的用法 WPF中StringFormat的用法可以参照C#中string.Format的用法 1. C#中用法: 格式化货币(跟系统的环境有关,中文系统默认格式化 ...

  2. 本文摘录 - FlumeJava

    本文节选不保证论文的完整性和理解的准确性  原始的MapReduce.分Map,Shuffle,Reduce. Map里包含shards. Shuffle理解为groupByKey的事情.Reduce ...

  3. .net core 2.0 读取配置文件

    1.引用Microsoft.Extensions.Configuration2.在Startup中注入服务 public static IConfiguration Configuration { g ...

  4. IdentityServer的基本概念与特性

    基本概念 IdentityServer4是一个基于OpenID Connect和OAuth 2.0的针对ASP.NET Core 2.0的框架. IdentityServer4可以帮助我们实现什么 I ...

  5. WPF 绑定到集合

    <Window x:Class="CollectionBinding.MainWindow"        xmlns="http://schemas.micros ...

  6. 毕业设计之感悟 —— UML 与 ER 图

    今天毕业设计答辩,虽然我第一个上场,但是不是特别紧张,因为整个系统都是我写的.我以为自己天衣无缝,能应付所有老师的所有问题.事实上,我被老师教育了一番. 老师说我,毕业论文中没有一个类.我一开始比较懵 ...

  7. vs2017 cordova调试ios app

    https://docs.microsoft.com/en-us/visualstudio/cross-platform/tools-for-cordova/first-steps/ios-guide ...

  8. codewars杂记: 寻找缺失的数

    题目描述: 给出一个整数列表,找出该列表无法通过各种组合求和得到的最小的整数. 示例: solve([1,2,8,7]) = 4, because we can get 1, 2, 1+2=3. Bu ...

  9. 【转】微信退款时候报”请求被中止: 未能创建 SSL/TLS 安全通道“或”The request was aborted: Could not create SSL/TLS secure channel“的错误

    退款测试在我本机测试一切都是正常的,但是发布到了服务器就报这样的一个错啦 但是无论百度或者google或者bing,你能够搜索到的结果都很类似,综合起来就是加这样一些代码,如下 ServicePoin ...

  10. .NET MVC 在action中,过滤器中,或视图中,如何分别获取 当前请求的 控制器/视图/区域 的名字

    1)过滤器中的: public class CMSAttribute : FilterAttribute, IAuthorizationFilter { public void OnAuthoriza ...