重温设计模式之 Factory
Posted 阿里技术
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重温设计模式之 Factory相关的知识,希望对你有一定的参考价值。
抽象产品角色(都有)
具体产品角色(都有)
抽象工厂角色(工厂方法模式和抽象工厂模式有)
具体工厂角色(都有)
上下文角色(都有)——调用工厂获取对象
package com.taobao.migao.pattern.factory.simplefactory;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 产品抽象接口:CPU
*/
public interface Cpu {
void calculate();
}
package com.taobao.migao.pattern.factory.simplefactory;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 产品的具体实现-A的CPU
*/
public class ACpu implements Cpu {
public void calculate() {
System.out.println("this is A cpu");
}
}
package com.taobao.migao.pattern.factory.simplefactory;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 产品的具体类型-B的CPU
*/
public class BCpu implements Cpu {
public void calculate() {
System.out.println("this is B cpu");
}
}
package com.taobao.migao.pattern.factory.simplefactory;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 简单工厂类:CPU的工厂
*/
public class CpuFactory {
/**
* 返回值是产品的抽象类型
* 简单工厂模式:创建哪种具体产品类型代码在工厂内部,如果需要新增具体产品,需要修改工厂类方法
* 例如需要增加C的cpu,需要修改下面的工厂方法,不符合开-闭原则
* @return
*/
public static Cpu createCpu(Class classType) {
if (classType.getName().equals(ACpu.class.getName())) {
return new ACpu();
} else if (classType.getName().equals(BCpu.class.getName())) {
return new BCpu();
}
return null;
}
}
package com.taobao.migao.pattern.factory.simplefactory;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 简单工厂测试类,对应程序中需要创建对象并调用对象方法的客户端代码
*/
public class SimpleFactoryTest {
public static void main(String[] args) {
Cpu cpu = CpuFactory.createCpu(BCpu.class);
cpu.calculate();
}
}
package com.taobao.migao.pattern.factory.factorymethod;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 产品抽象接口:CPU
*/
public interface Cpu {
void calculate();
}
package com.taobao.migao.pattern.factory.factorymethod;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 产品的具体实现-A的CPU
*/
public class ACpu implements Cpu {
public void calculate() {
System.out.println("this is A cpu");
}
}
package com.taobao.migao.pattern.factory.factorymethod;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 产品的具体类型-B的CPU
*/
public class BCpu implements Cpu {
public void calculate() {
System.out.println("this is B cpu");
}
}
package com.taobao.migao.pattern.factory.factorymethod;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description CPU这个产品类型的抽象工厂
*/
public interface CpuFactory {
/**
* 这是CPU产品的工厂,所以专门生产CPU,返回的类型是对应产品的抽象类型
*/
Cpu createCpu();
}
package com.taobao.migao.pattern.factory.factorymethod;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 工厂方法模式下,一个工厂对应一个产品:一个抽象工厂对应抽象产品,一个具体工厂对应一个具体产品
*/
public class ACpuFactory implements CpuFactory{
public Cpu createCpu() {
return new ACpu();
}
}
package com.taobao.migao.pattern.factory.factorymethod;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 工厂方法模式下,一个工厂对应一个产品:一个抽象工厂对应抽象产品,一个具体工厂对应一个具体产品
*/
public class BCpuFactory implements CpuFactory {
public Cpu createCpu() {
return new BCpu();
}
}
package com.taobao.migao.pattern.factory.factorymethod;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 测试类 使用具体的工厂实现来创建产品对象
*/
public class FactoryMethodTest {
public static void main(String[] args) {
CpuFactory factory = new ACpuFactory();
Cpu cpu = factory.createCpu();
cpu.calculate();
}
}
简单工厂模式中,客户端决定传递什么类型的参数,在工厂中根据不同的参数决定创建不同的对象,即工厂内部有决策创建产品的逻辑。
工厂方法模式中,具体工厂内部很纯净,什么类型的工厂就负责创建对应的产品,决策的逻辑全部在客户端中实现。
抽象产品
具体产品
抽象工厂:以产品族维度建工厂类,类中含有多个抽象方法,每个方法对应创建一个产品。
具体工厂:具体工厂实现抽象工厂,并实现里面的所有产品创建方法,创建属于当前具体产品对象。
环境类:持有抽象工厂,并可以在运行时注入具体工厂。
package com.taobao.migao.pattern.factory.abstractfactory;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 产品抽象接口:CPU
*/
public interface Cpu {
void calculate();
}
package com.taobao.migao.pattern.factory.abstractfactory;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 抽象产品:主板
*/
public interface Mainboard {
void installCpu();
}
package com.taobao.migao.pattern.factory.abstractfactory;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 产品的具体实现-A的CPU
*/
public class ACpu implements Cpu {
public void calculate() {
System.out.println("this is A cpu");
}
}
package com.taobao.migao.pattern.factory.abstractfactory;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 产品的具体实现-B的CPU
*/
public class BCpu implements Cpu {
public void calculate() {
System.out.println("this is B cpu");
}
}
package com.taobao.migao.pattern.factory.abstractfactory;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description
*/
public class AMainboard implements Mainboard {
public void installCpu() {
System.out.println("this is A mainboard");
}
}
package com.taobao.migao.pattern.factory.abstractfactory;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description
*/
public class BMainboard implements Mainboard {
public void installCpu() {
System.out.println("this is B mainboard");
}
}
package com.taobao.migao.pattern.factory.abstractfactory;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 抽象工厂,定义了工厂需要负责创建的产品
*/
public interface AbatractFactory {
//创建CPU产品
Cpu createCpu();
//创建主板产品
Mainboard createMainboard();
}
package com.taobao.migao.pattern.factory.abstractfactory;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 具体的工厂,以产品族维度建立具体的工厂
*/
public class AFactory implements AbatractFactory {
public Cpu createCpu() {
return new ACpu();
}
public Mainboard createMainboard() {
return new AMainboard();
}
}
package com.taobao.migao.pattern.factory.abstractfactory;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 具体工厂,以产品族维度建立具体的工厂
*/
public class BFactory implements AbatractFactory {
public Cpu createCpu() {
return new BCpu();
}
public Mainboard createMainboard() {
return new BMainboard();
}
}
package com.taobao.migao.pattern.factory.abstractfactory;
/**
* @author <a href="mailto:migao.jjm@alibaba-inc.com">jiongmin.jjm</a>
* @version 1.0
* @description 抽象工厂测试类,持有具体的工厂实例,调用工厂的方法获取具体的产品对象
*/
public class AbstractFactoryTest {
public static void main(String[] args) {
//注入A工厂
AbatractFactory factory = new AFactory();
Cpu cpu = factory.createCpu();
Mainboard mainboard = factory.createMainboard();
cpu.calculate();
mainboard.installCpu();
}
}
本课程从 Serverless 基本概念、为开发者带来的实际价值、常见的架构模式以及技术选型四个方面,带大家学习了解 Serverless。
点击“阅读原文”开始学习吧~
以上是关于重温设计模式之 Factory的主要内容,如果未能解决你的问题,请参考以下文章
Head First 设计模式之工厂模式(Factory Pattern)
Java设计模式之工厂模式(Factory Pattern)