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