* 抽象工厂:

  意图在于创建一系列互相关联或互相依赖的对象。
* 每个工厂都会创建一个或多个一系列的产品
* 适用于:产品不会变动,开始时所有产品都创建好,然后根据分类获取想要的 某一类产品(很像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. 解决tomcat占用8080端口问题图文教程

    在dos下,输入  netstat   -ano|findstr  8080 //说明:查看占用8080端口的进程 显示占用端口的进程 taskkill  /pid  6856  /f //说明,运行 ...

  2. php CodeIgniter处理多环境错误级别配置

    php CodeIgniter处理多环境错误级别配置 开发者常常希望当系统运行在开发环境或生产环境中时能有不同的行为, 例如,在开发环境如果程序能输出详细的错误信息将非常有用,但是在 生产环境这将造成 ...

  3. datatables条件判断列显示还是隐藏

    定义一个状态变量status根据条件取值true或者false,然后在datatables参数设置中相应的columns属性的data后面加上"visible":status,该列 ...

  4. Error -26612: HTTP Status-Code=500 (Internal Server Error) ...

    造成HTTP-500错误,有朋友告诉我如下几个可能: 1.运行的用户数过多,对服务器造成的压力过大,服务器无法响应,则报HTTP500错误.减小用户数或者场景持续时间,问题得到解决. 2.该做关联的地 ...

  5. javaWeb 使用jsp标签进行防盗链

    /** * 1.新建类继承SimpleTagSupport * 新建2个属性, 添加对应的set方法 * 覆盖doTag()方法 */ import java.io.IOException; impo ...

  6. 28、Oracle(四)用户权限控制

    一)用户Oracle中的用户分为二大类1)Oracle数据库服务器创建时,由系统自动创建的用户,叫系统用户,如sys.2)利用系统用户创建的用户,叫普通用户,如scott,hr,c##tiger,zh ...

  7. C#:写日志

    一.直接写入文件 /// <summary> /// 将message的内容写入日志文件 /// </summary> /// <param name="msg ...

  8. ecshop后台增加模板页的方法

    CShop的动态模板机制是一个非常灵活的系统,管理员可以在后台根据自己的要求调整模板模块的显示位置.本文详细讲解了如何修改ECSHOP内部结构使得用户可以添加自己的模板页从而方便灵活的使用系统自带的模 ...

  9. asp.net导入Excel表

    一.导入Excel的界面这个界面很简单,代码就不列出来了.二.导入的代码我分了两部分,第一部分是点击查看数据的代码,这个是将数据导入到DataTable里面,但是还没有导入到数据库里.这里需要注意的是 ...

  10. 哈希-Gold Balanced Lineup 分类: POJ 哈希 2015-08-07 09:04 2人阅读 评论(0) 收藏

    Gold Balanced Lineup Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13215 Accepted: 3873 ...