* 抽象工厂:

  意图在于创建一系列互相关联或互相依赖的对象。
* 每个工厂都会创建一个或多个一系列的产品
* 适用于:产品不会变动,开始时所有产品都创建好,然后根据分类获取想要的 某一类产品(很像spring容器)

代码解释:

1.创建产品接口:手机和它的实现子类

//手机接口
public interface MobileProduct { } //实现子类Android
public class Android implements MobileProduct{ public Android() {
System.out.println("生产一个Android手机...");
}
} //实现子类Apple
public class Apple implements MobileProduct{ public Apple() {
System.out.println("生产一个Apple手机...");
}
}

2.创建产品接口2:汽车,和它的实现子类

//第二种产品:汽车
public interface CarProduct { } //实现子类1:宝马
public class BaoMa implements CarProduct{ public BaoMa() {
System.out.println("生产一个宝马汽车...");
}
} //实现子类2:奔驰
public class BenChi implements CarProduct{ public BenChi() {
System.out.println("生产一个奔驰汽车...");
}
}

3.创建抽象父类(或者抽象接口)和方法:可以生产手机和汽车,但是具体生产那种手机和汽车,不一定(由子类决定),因为里面的方法返回也是抽象的

//这里写接口也可以,抽象类个人理解:具体能看见的事物;接口:看不见的
public abstract class AbstractFactory { /**
* 生产一个产品
* @return
*/
public abstract MobileProduct processMobile();
/**
* 生产一个产品
* @return
*/
public abstract CarProduct processCar();
}

4.实现2个生产系列产品的工厂

/**
* 生产 产品系列:一个苹果,一个宝马
* @author mlxs
*
*/
public class FactoryMothedA extends AbstractFactory{ @Override
public MobileProduct processMobile() {
return new Apple();
} @Override
public CarProduct processCar() {
return new BaoMa();
} }
/**
* 生产方式B 产品系列:一个安卓,一个奔驰
* @author mlxs
*
*/
public class FactoryMothedB extends AbstractFactory{ @Override
public MobileProduct processMobile() {
return new Android();
} @Override
public CarProduct processCar() {
return new BenChi();
}
}

5.客户端测试

public static void main(String[] args) {
System.out.println("-----------------生产系列A:苹果和宝马-------------------");
//生产系列A:苹果和宝马
AbstractFactory factory = new FactoryMothedA();
factory.processMobile();
factory.processCar(); System.out.println("\n-----------------生产系列B:安卓和奔驰-------------------");
    //生产系列B:安卓和奔驰
    AbstractFactory factoryB = new FactoryMothedB();
    factory.processMobile(); factory.processCar(); }

6.结果:

-----------------生产系列A:苹果和宝马-------------------
生产一个Apple手机...
生产一个宝马汽车... -----------------生产系列B:安卓和奔驰-------------------
生产一个Apple手机...
生产一个宝马汽车...

缺陷:有新产品的时候,改动地方很多(产品类、系列工厂类、抽象工厂类都要改)

factory工厂模式之抽象工厂AbstractFactory的更多相关文章

  1. JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式

    上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone() 方法实现浅克隆,浅克隆也要实现Cloneable 标记接口.而深克隆则是将对象通过序列化和反序列化 的方式进行创建 ...

  2. c#工厂模式与抽象工厂模式

    一. 工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中. 工厂方法模式是简单工 ...

  3. C# 设计模式(1)——简单工厂模式、工厂模式、抽象工厂模式

    1.前言 上一篇写了设计模式原则有助于我们开发程序的时候能写出高质量的代码(牵一发而不动全身),这个系列还是做个笔记温习一下各种设计模式,下面就看看简单工厂模式.工厂模式.抽象工厂模式. 2.简单工厂 ...

  4. C#设计模式--工厂模式和抽象工厂模式

    话说有三大潮牌公司一直相互PK,有一天举办了一个活动让这三大公司来一个PK,我们来看看哪家公司的上衣做出来好看穿得舒服 现在我们有一个上衣的抽象产品让三大公司来做 //抽象产品 public inte ...

  5. Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂[转]

     1  2 {<HeadFirst设计模式>工厂模式之抽象工厂 }  3 { 抽象工厂的产品                       }  4 { 编译工具:Delphi7.0     ...

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

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

  7. [19/04/23-星期二] GOF23_创建型模式(工厂模式、抽象工厂模式)

    一.工厂模式(分为:简单工厂模式.工厂方法模式.抽象工厂模式) 实现了创建者和调用者的分离 核心本质:1.实例化对象,用工厂方法代替new操作:2.将选择实现类.创建对象统一管理和控制,从而将调用者跟 ...

  8. 设计模式之工厂模式VS抽象工厂

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...

  9. Objective-C 工厂模式(下) -- 抽象工厂模式

    相比简单工厂模式, 只有一个工厂 能生产的手机也是固定的 抽象工厂模式类似于有很多家工厂, 当用户要买什么手机就创建对应的工厂去生产 比如用户要买iPhone就创建一个Apple工厂来生产手机, 要买 ...

随机推荐

  1. python False

    None 空字符串 空列表 空元组 空字典 false为False

  2. Oracle错误:ORA-01033

    Oracle错误:ORA-01033 错误编码:ORA-01033: ORACLE initialization or shutdown in progress 故障描述:因为移动了数据库文件([NA ...

  3. PHP和Java的主要区别有哪些呢?

    解释 PHP与Java作为两种截然不同的程序开发语言,无论是技术层面还是发展空间,亦或是市场份额占比,都有着不同的表现方式,理念上的不同导致了Java和PHP在Web应用开发上显示了不同的结果.若要一 ...

  4. PHP上传文件详解 错误提示

    首先在php.ini里配置上载文件.有以下几个重要的配置单: 选项 默认值 说明 post_max_size 8M 控制以后的POST请求的最大规模.必须大于upload_max_filesize选项 ...

  5. [Ogre][地形][原创]基于OgreTerrain的地形实现

    需要用到的外部图片资源: 在ogre调用时需要多用到的几个外部dll: OgreTerrain_d.dll 需要添加头文件 #include "Ogre\Ogre.h"#inclu ...

  6. protoful进行序列化

    Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化.它很适合做数据存储或 RPC 数据交换格式.可用于通讯协议.数据存储等领域的语言无关.平台 ...

  7. YTU 3019: 螺旋方阵

    3019: 螺旋方阵 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 题目描述 以下是一个5*5阶螺旋方阵.设计一个程序,输出该形式的n*n阶方阵(顺时针方向旋进).   ...

  8. Gson心得小笔记

    又和往常一样看项目的时候遇到了点新的东西,至少对我来说是个新的东西吧.Gson 废话不多说.个人认为Gson主要用来实现对象和json之间的转换. 例如有个person对象,想要把这个对象转化为jso ...

  9. c# 财务数据编号的生辰

    实现逻辑: 根据票号前戳+生成的6位数据编号=收据号(010+000001=010000001) 作废票号      将票号作废,插入到编号表中,以此下次在使用 作废票号使用 编号表中 现在只有2,当 ...

  10. Alice and Bob(贪心HDU 4268)

    Alice and Bob Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...