工厂方法模式定义了一个创建对象的接口(工厂方法),但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
工厂方法模式能够封装具体类型的实例化。观察下面的类图,抽象的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 设计模式 mvc模式 单例模式 代理 工厂 简单工厂
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...
Java设计模式中的工厂模式,MainDemo.java 是项目演示入口
JAVA 设计模式: 工厂模式 代理模式 迭代模式 责任链模式 源码
java三种工厂模式文档+三个实例,里面有个word文档是学习文档 然后配套有三个项目学习
用myeclipse开发的java设计模式课程设计,课题内容为西瓜工厂,包含四个设计模式,单例模式、代理模式、建造者模式和抽象工厂模式,有较好的图形界面,文档内附有完整代码,适用于新手学习。
设计模式之工厂模式Java实现和类设计图,包括简单工厂模式、工厂方法模式和抽象工厂模式
java,设计模式中的一种,工厂设计模式。
《java设计模式》课后习题及模拟试题答案
章节介绍:1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之...
使用5种设计模式完成的一个点单系统,显示不同系列下的所有商品,点击选择冰度甜度之后添加到订单中,计算总金额,下单之后发送订单到门店的后厨制作商品。使用了抽象工厂模式、装饰模式、单例模式、代理模式、原型...
java设计模式之工厂模式(3种完整免费提供).pdfjava设计模式之工厂模式(3种完整免费提供).pdfjava设计模式之工厂模式(3种完整免费提供).pdfjava设计模式之工厂模式(3种完整免费提供).pdfjava设计模式之工厂模式(3种...
设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:...
《Java设计模式》面向有一定Java语言基础和一定编程经验的读者,重点探讨在Java程序设计中怎样使用著名的23个设计模式。《Java设计模式》的目的是让读者不仅学习怎样在软件设计中使用好设计模式,更重要的是让读者...
Java设计模式之工厂模式实现,供大家一起共同分享学习。
Java设计模式05工厂方法模式
Java设计模式之一简单工厂模式(SimpleFactory)源码