假如我们的苹果和香蕉还分为北方的和南方的,那么苹果Apple和香蕉Banana就是抽象类了,所以采集的方法就应该抽象的

第一步:

我们会创建北方的苹果NorthApple类和SourthBanana类,这两个类继承Apple,北方的香蕉NorthBanana类和SourthBanana类,其中实现各自的采集方法get()

第二步:

当然我们通过北方水果工厂NorthFruitFactory和南方水果工厂SourthFruitFactory来获取北方的苹果和香蕉这两个实例,这两个工厂实现FruitFactory这个接口,接口中有两个未实现的获取苹果和香蕉的实例方法,由NorthFruitFactory和SourthFruitFactory具体实现

第三步:

当我们调用的时候就可以通过抽象工厂来获取想要的实例对象,通过实例对象来调用对应的方法

FruitFactory factory = new SourthFruitFactory();
Fruit fruit =factory.getApple();//获取南方的苹果
fruit.get();

代码如下:

Fruit.java

package com.designpattern.abstractfactory;

public interface Fruit {
public void get();
}

Apple.java

package com.designpattern.abstractfactory;

public abstract class Apple implements Fruit{
public abstract void get();
}

Banana.java

package com.designpattern.abstractfactory;

public abstract class Banana implements Fruit{
public abstract void get();
}

NorthApple.java

package com.designpattern.abstractfactory;

public class NorthApple extends Apple {
public void get() {
System.out.println("采集北方苹果");
} }

NorthBanana.java

package com.designpattern.abstractfactory;

public class NorthBanana extends Banana {
public void get() {
System.out.println("采集北方香蕉");
} }

SourthApple.java

package com.designpattern.abstractfactory;

public class SourthApple extends Apple {
public void get() {
System.out.println("采集南方苹果");
} }

SourthBanana.java

package com.designpattern.abstractfactory;

public class SourthBanana extends Banana {
public void get() {
System.out.println("采集南方香蕉");
} }

FruitFactory.java

package com.designpattern.abstractfactory;

public interface FruitFactory {
public Fruit getApple();
public Fruit getBanana();
}

NorthFruitFactory.java

package com.designpattern.abstractfactory;

public class NorthFruitFactory implements FruitFactory {

    public Fruit getApple() {
return new NorthApple(); } public Fruit getBanana() {
return new NorthBanana(); } }

SourthFruitFactory.java

package com.designpattern.abstractfactory;

public class SourthFruitFactory implements FruitFactory {

    public Fruit getApple() {
return new SourthApple(); } public Fruit getBanana() {
return new SourthBanana(); } }

MainClass.java

package com.designpattern.abstractfactory;

public class MainClass {
public static void main(String[] args) {
FruitFactory factory = new SourthFruitFactory();//我们只需要知道具体的工厂,而不需要知道具体的类
Fruit fruit =factory.getApple();
fruit.get();
}
}

一、什么是抽象工厂模式

在讲解抽象工厂模式之前,我们需要知道两个概念:

产品等级结构。产品的等级结构也就是产品的继承结构。例如一个为空调的抽象类,它有海尔空调、格力空调、美的空调等一系列的子类,那么这个抽象类空调和他的子类就构成了一个产品等级结构,苹果就分为北方苹果和南方苹果。

产品族。产品族是在抽象工厂模式中的。在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。比如,海尔工厂生产海尔空调。海尔冰箱,那么海尔空调则位于空调产品族中。北方水果工厂就生产北方的苹果和北方的香蕉。

抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。

二、抽象工厂的优缺点

优点

1、  抽象工厂隔离了具体类的生成,是的客户端不需要知道什么被创建。所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

2、  当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。

缺点

添加新的行为时比较麻烦。如果需要添加一个新产品族对象时,需要更改接口及其下所有子类,这必然会带来很大的麻烦。

设计模式学习之抽象工厂(Abstract Factory,创建型模式)(3)的更多相关文章

  1. 设计模式学习之简单工厂(Simple Factory,创建型模式)(1)

    简单工厂(Simple Factory,创建型模式) 第一步: 比如我们要采集苹果和香蕉,那么我们需要创建一个Apple类和Banana类,里面各自有采集方法get(),然后通过main方法进行调用, ...

  2. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  3. 设计模式学习心得<抽象工厂模式 Abstract Factory>

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...

  4. 5、抽象工厂 abstract factory 将关联组件组成产品 创建型模式

    趁热打铁,紧跟着上一节的工厂方法模式.这一节介绍一下抽象工厂模式,以及分析俩个模式的不同 1.何为抽象模式? 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他 ...

  5. 设计模式四: 抽象工厂(Abstract Factory)

    简介 抽象工厂模式是创建型模式的一种, 与工厂方法不同的是抽象工厂针对的是生产一组相关的产品, 即一个产品族. 抽象工厂使用工厂方法模式来生产单一产品, 单一产品的具体实现分别属于不同的产品族. 抽象 ...

  6. 面向对象设计——抽象工厂(Abstract Factory)模式

    定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产 ...

  7. 工厂模式[3] 抽象工厂 Abstract Factory

    简介 1.简单工厂,或静态工厂,产品接口 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类或实现同一接口 优点:客户端可以直接消费产品,而不必关心具体产品的实现(不关心对象的 ...

  8. 设计模式之美:Creational Patterns(创建型模式)

    创建型模式(Creational Patterns)抽象了对象实例化过程. 它们帮助一个系统独立于如何创建.组合和表示它的那些对象. 一个类创建型模式使用继承改变被实例化的类. 一个对象创建型模式将实 ...

  9. Java 23种设计模式详尽分析与实例解析之一--创建型模式

    面向对象的设计原则 常用的面向对象设计原则包括7个,这些原则并不是独立存在的,它们相互依赖.互为补充. Java设计模式 创建型模式 简单工厂模式 模式动机: 考虑一个简单的软件应用场景,一个软件系统 ...

随机推荐

  1. varnish4.0简介

    Varnish 4.0 简介 Varnish 是一款开源的HTTP加速器和反向代理服务器,它的主要特点有: (1)是基于内存缓存,重启后数据将消失.(2)利用虚拟内存方式,io性能好.(3)支持设置0 ...

  2. ALTER 语句修改数据表

    1.修改数据表名:alter table 表名 rename 新表名; 2.修改列名: alter table 表名 change 列名 新列名(可以与旧的一样) 类型 默认值; 3.修改类型: al ...

  3. ctags 的最简单使用

    vim插件ctags的安装和使用 2013-11-19 20:47 17109人阅读 评论(0) 收藏 举报  分类: 开发工具(3)  linux编程(9)  c/c++编程(11)  版权声明:本 ...

  4. android TP驱动移植调试笔记(转)

    1. 添加I2C 设备 TP 一般采用的是I2C 作为数据和命令接口,所以TP 驱动也可以归类为I2C 驱动.TP驱动的主要逻辑不在这里,但是了解了Linux 的I2C 体系架构,就可以对整个驱动流程 ...

  5. 转 Citrix XenCenter安装VM之挂载ISO详解

    转自:http://www.2cto.com/os/201302/190713.html 环境信息:XenServer Version:6.0.2XenCenter Version:6.0.2NFS ...

  6. Telnet是什么?

    Telnet协议是 用途一: 测试端口号 例子:测试本机的80端口是否打开 1.获得本机IP dos命令:ipconfig 可以看到本机的IP地址是192.168.0.102,当然这也是局域网IP,并 ...

  7. 淘宝(阿里百川)手机客户端开发日记第七篇 Service,Handler和Thread

    现在我们已经已经知道android有Service,Handler和Thread这些内容了,但是我想应该还有很多人对此并不是很清楚他们之间的区别! (1)Service 是运行在后端的程序,不与UI直 ...

  8. weblogic <BEA-000438>

    现在创建域并启动服务器, 或许会发现如下提示的错误信息:<Error> <Socket> <BEA-000438> <Unable to load perfo ...

  9. HTML快速入门2

    三.版面风格控制 1. 字体控制 A. 字体大小 用 <font Size=#> 和 </font> 表示,#为字号: 1 - 7 ,缺省为 3 ,可用 <basefon ...

  10. Centos下samba共享打印机

    先说需求,公司有一台型号为HP LaserJet m1120 mfp的打印机,由于不是网络打印机使用起来十分不便,公司老大要求将这台打印机连在公司的内网linux服务器上(CentOS),然后配置sa ...