工厂方法模式定义了一个创建对象的接口(工厂方法),但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
工厂方法模式能够封装具体类型的实例化。观察下面的类图,抽象的Provider类提供了一个创建对象的方法的接口,也称为“工厂方法”。在抽象的Provider中,任何其他实现的方法,都可能使用到这个工程方法所制造出来的产品,但只有子类真正实现这个工工厂方法并创建产品。
抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品是什么。这样一来,客户就从具体的产品中被解耦。
类图:
package com.zaxk.study.pattern;
/**
* 工厂方法模式 & 抽象工厂模式
* Created by ZhuXu on 2017/11/9 0009.
*/
public class FactoryTest {
public static void main(String[] args) {
Provider provider;
provider = new ChinaMobile1G();
provider.describe("day");
provider = new ChinaMobile1G();
provider.describe("month");
provider = new ChinaTelecom2G();
provider.describe("day");
provider = new ChinaTelecom2G();
provider.describe("month");
}
}
/**
* 供应商
* 工厂方法模式:Creator
* 抽象工厂模式:AbstractClient
*/
abstract class Provider {
// 工厂方法:所有供应商子类都实现此方法
public abstract FlowratePackage create(String type);
// 已实现的方法:使用工厂方法创建出来的产品
public void describe(String type) {
FlowratePackage flowratePackage = create(type);
System.out.println(flowratePackage.company + ":" + flowratePackage.desc + ",包含流量" + flowratePackage.flowrate + "M,售价" + flowratePackage.price + "元");
}
}
/**
* 中国移动1G流量包供应商
* 工厂方法模式:ConcreteCreator
* 抽象工厂模式:Client
*/
class ChinaMobile1G extends Provider {
// 实例化1G流量包工厂
FlowratePackageFactory factory = new Flowrate1G();
// 实现工厂方法,根据客户要求,使用实例化后的抽象工厂创建流量包
@Override
public FlowratePackage create(String type) {
FlowratePackage flowratePackage = null;
switch (type) {
case "day":
flowratePackage = new DayFlowratePackage(factory);
break;
case "month":
flowratePackage = new MonthFlowratePackage(factory);
break;
case "halfyear":
flowratePackage = new HalfYearFlowratePackage(factory);
break;
default:
flowratePackage = new DayFlowratePackage(factory);
break;
}
flowratePackage.company = "中国移动";
flowratePackage.prepare();
return flowratePackage;
}
}
/**
* 中国电信2G流量包供应商
* 工厂方法模式:ConcreteCreator
* 抽象工厂模式:Client
*/
class ChinaTelecom2G extends Provider {
// 实例化2G流量包工厂
FlowratePackageFactory factory = new Flowrate2G();
// 实现工厂方法,根据客户要求,使用实例化后的抽象工厂创建流量包
@Override
public FlowratePackage create(String type) {
FlowratePackage flowratePackage = null;
switch (type) {
case "day":
flowratePackage = new DayFlowratePackage(factory);
break;
case "month":
flowratePackage = new MonthFlowratePackage(factory);
break;
case "halfyear":
flowratePackage = new HalfYearFlowratePackage(factory);
break;
default:
flowratePackage = new DayFlowratePackage(factory);
break;
}
flowratePackage.company = "中国电信";
flowratePackage.prepare();
return flowratePackage;
}
}
/**
* 流量包
* 工厂方法模式:Product
* 抽象工厂模式:AbstractProduct
*/
abstract class FlowratePackage {
String company;
String desc;
int flowrate;
int price;
// 持有流量包抽象工厂
FlowratePackageFactory factory;
abstract void prepare();
}
/**
* 日流量包
* 工厂方法模式:ConcreteProduct
* 抽象工厂模式:Product
*/
class DayFlowratePackage extends FlowratePackage {
// 持有流量包抽象工厂
DayFlowratePackage(FlowratePackageFactory factory) {
this.factory = factory;
}
// 使用流量包工厂创建流量包
@Override
void prepare() {
desc = "日流量包";
flowrate = factory.getFlowrate();
price = factory.getPrice();
}
}
/**
* 月流量包
* 工厂方法模式:ConcreteProduct
* 抽象工厂模式:Product
*/
class MonthFlowratePackage extends FlowratePackage {
// 持有流量包抽象工厂
MonthFlowratePackage(FlowratePackageFactory factory) {
this.factory = factory;
}
// 使用流量包工厂创建流量包
@Override
void prepare() {
desc = "月流量包";
flowrate = factory.getFlowrate();
price = factory.getPrice();
}
}
/**
* 半年流量包
* 工厂方法模式:ConcreteProduct
* 抽象工厂模式:Product
*/
class HalfYearFlowratePackage extends FlowratePackage {
// 持有流量包抽象工厂
HalfYearFlowratePackage(FlowratePackageFactory factory) {
this.factory = factory;
}
// 使用流量包工厂创建流量包
@Override
void prepare() {
desc = "半年流量包";
flowrate = factory.getFlowrate();
price = factory.getPrice();
}
}
/**
* 抽象工厂模式:AbstractFactory - 流量包工厂
*/
interface FlowratePackageFactory {
int getFlowrate();
int getPrice();
}
/**
* 抽象工厂模式:ConcreteFactory - 1G流量包工厂
*/
class Flowrate1G implements FlowratePackageFactory {
@Override
public int getFlowrate() {
return 1024;
}
@Override
public int getPrice() {
return 10;
}
}
/**
* 抽象工厂模式:ConcreteFactory - 2G流量包工厂
*/
class Flowrate2G implements FlowratePackageFactory {
@Override
public int getFlowrate() {
return 2048;
}
@Override
public int getPrice() {
return 20;
}

- 大小: 162 KB
分享到:
相关推荐
java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式java设计模式之工厂模式...
例题简单的阐述了Java工厂模式的概念,有利于读者更好地了解Java工厂模式
Java工厂模式是面向对象设计模式中的一个重要概念,它提供了一种创建对象的最佳方式。在工厂模式中,我们创建对象时不直接实例化具体类,而是通过一个接口或者抽象类来间接创建。这种模式的核心在于将对象的创建过程...
本篇文章将对标题与描述中提到的几个关键Java设计模式进行深入分析。 首先,让我们来看一下MVC模式,这是一种广为接受的架构模式,用于构建用户界面。在MVC模式中,Model层管理数据以及业务逻辑,View层负责将数据...
Java设计模式是面向对象编程领域中的重要概念,它是一套被广泛接受并实践的解决软件设计问题的经验总结。设计模式并非具体的代码或库,而是一种在特定情境下为了解决常见问题而制定的通用解决方案的描述。它们描述了...
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...
### Java设计模式详解 #### 一、背景与概念 在软件工程领域,设计模式是一种用于解决常见问题的可重用解决方案。《Java设计模式PDF》是一本由James W. Cooper编写的经典书籍,该书详细介绍了Java编程语言中的设计...
Java设计模式是软件工程中的一种最佳实践,它总结了在特定场景下解决常见问题的经验,为程序员提供了可重用的解决方案。本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与...
在这个Java设计模式的实例中,我们将深入探讨工厂模式的概念、工作原理以及如何通过`MainDemo.java`实现一个简单的工厂模式DEMO。 ### 工厂模式概述 工厂模式的主要目标是隔离对象的创建过程,使得客户端代码不...
工厂模式是设计模式中的一种,属于创建型模式,它的主要目标是提供一个创建对象的接口,但让子类决定实例化哪一个类。这样,工厂模式使代码能够独立于实际的产品类型进行工作。 工厂模式的核心思想是通过一个共同的...
《Java设计模式》课程设计报告主要探讨了如何利用Java编程语言和MyEclipse集成开发环境来实现基于设计模式的西瓜市场系统。这个项目涵盖了四种重要的设计模式:单例模式、代理模式、建造者模式和抽象工厂模式,为...
Java设计模式中的工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,当客户端请求创建一个产品对象时,它不会直接创建,而是调用一个工厂对象来完成创建工作。这种模式的核心在于封装了对象...
### Java设计模式(刘伟) #### 一、引言 在《Java设计模式》这本书中,作者刘伟全面地介绍了24种经典的设计模式,并通过丰富的案例和代码示例进行了详细的解析。本书不仅适合初学者作为入门教材,也适合有一定...
"设计模式之java工厂模式"是关于如何优雅地创建对象的一种经典设计模式,它属于创建者模式类别。创建者模式主要关注对象的创建,而工厂模式则在其中扮演着重要角色,因为它提供了一种抽象的方式来创建对象,从而使...
"设计模式单例模式和工厂模式综合应用"的主题聚焦于两种常用的设计模式:单例模式和工厂模式,并探讨它们如何协同工作来实现高效、灵活的代码结构。这个主题尤其适用于Java编程语言,因为Java的面向对象特性使得设计...
以下是关于JAVA设计模式中提及的四种模式——工厂模式、代理模式、迭代器模式以及责任链模式的详细说明。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建...
题目中的第一个选项“同一问题的不同表现形式”(A) 描述了设计模式的主要应用场景之一。设计模式帮助开发者处理常见的软件设计难题,确保代码的可读性、可维护性和可扩展性。 ### 2. 面向对象的基本原则 面向对象...
《Java设计模式》是刘伟老师撰写的经典教材,它为Java程序员深入理解和应用设计模式提供了极佳的学习资源。设计模式作为软件工程中解决特定问题的典型方案,是每一个有志于成为高级开发者的程序员不可或缺的知识储备...
在Java编程语言中,工厂模式通常分为简单工厂模式、工厂方法模式和抽象工厂模式三种类型。这些模式都是围绕着一个中心思想:将对象的实例化过程封装起来,使代码更加灵活且易于维护。 1. **简单工厂模式**: 简单...
《Java设计模式》是刘伟教授的一本关于设计模式的教材,主要面向高等学校的学生和对Java编程有深入兴趣的开发者。设计模式是软件工程中的一种重要思想,它封装了在特定场景下的问题解决方案,可以提高代码的可读性、...