目录
一、关于工厂方法模式
设计模式:13、工厂方法模式(虚拟构造)_列举工厂设计模式的使用方式和逻辑-CSDN博客
二、设计要求
系统目前已经按着有关药品的规定设计了一个抽象类Drug,该抽象类特别规定了所创建的药品必须给出药品的成分及含量。Drug目前有两个子类:Paracetamol和Amorolfine。Paracetamol子类负责创建氨加黄敏一类的药品,Amorolfine子类负责创建盐酸阿莫罗芬一类的药品。
一个为某药店开发的应用程序需要使用Drug类的某个子类的实例为用户提供药品,但是药店的应用程序不能使用Drug的子类的构造方法直接创建对象,因为药店没有能力给出药品的各个成分的含量,只有药厂才有这样的能力。
请使用工厂方法模式为已有系统编写一个抽象类,并在其中定义工厂方法,该工厂方法返回Drug类的子类的实例。
三、设计实现
UML类图:

1.抽象产品
java
package xyz.jangle.design.app.factory;
/**
* 抽象产品
* @author jangle
* @email jangle@jangle.xyz
* @time 2026年10月18日 上午10:27:56
*
*/
public abstract class Drug {
String constitute;
String name;
public String getConstitute() {
return constitute;
}
public String getName() {
return name;
}
}
2.具体产品
java
package xyz.jangle.design.app.factory;
/**
* 具体产品 对乙酰氨基酚
* @author jangle
* @email jangle@jangle.xyz
* @time 2026年10月18日 上午10:29:41
*
*/
public class Paracetamol extends Drug {
String part1 = "每粒含乙醯氨基酚";
String part2 = "每粒含咖啡因";
String part3 = "每粒含人工牛黄";
String part4 = "每粒含马来酸氯苯";
public Paracetamol(String name,int[] a) {
this.name = name;
part1 = part1 +":"+a[0]+"毫克\n";
part2 = part2 +":"+a[1]+"毫克\n";
part3 = part3 +":"+a[2]+"毫克\n";
part4 = part4 +":"+a[3]+"毫克\n";
constitute = part1+part2+part3+part4;
}
}
java
package xyz.jangle.design.app.factory;
/**
* 具体产品 阿莫洛芬
* @author jangle
* @email jangle@jangle.xyz
* @time 2026年10月18日 上午10:34:39
*
*/
public class Amorolfine extends Drug {
String part1 = "每粒含甲硝锉";
String part2 = "每粒含人工牛黄";
public Amorolfine(String name, int[] a) {
this.name = name;
part1 = part1 + ":"+a[0]+"毫克\n";
part2 = part2 + ":"+a[1]+"毫克\n";
constitute = part1 +part2 ;
}
}
3.构造者
java
package xyz.jangle.design.app.factory;
/**
* 构造者
* @author jangle
* @email jangle@jangle.xyz
* @time 2026年10月18日 上午10:37:02
*
*/
public interface DrugCreator {
Drug getDrug();
}
4.具体构造者
java
package xyz.jangle.design.app.factory;
/**
* 具体构造者
* @author jangle
* @email jangle@jangle.xyz
* @time 2026年10月18日 上午10:39:34
*
*/
public class ParaDrugCreator implements DrugCreator {
@Override
public Drug getDrug() {
int[] a = {250,15,1,10};
return new Paracetamol("氨加黄敏胶囊", a);
}
}
java
package xyz.jangle.design.app.factory;
/**
* @author jangle
* @email jangle@jangle.xyz
* @time 2026年10月18日 上午10:42:24
*
*/
public class AmorDrugCreator implements DrugCreator {
@Override
public Drug getDrug() {
int[] a = {200,5};
return new Amorolfine("甲硝锉胶囊", a);
}
}
四、应用程序
java
package xyz.jangle.design.app.factory;
/**
* @author jangle
* @email jangle@jangle.xyz
* @time 2026年10月18日 上午10:45:29
*
*/
public class Application {
public static void main(String[] args) {
DrugCreator creator = new ParaDrugCreator();
Drug drug = creator.getDrug();
System.out.println(drug.getName()+"的成分是:");
System.out.println(drug.getConstitute());
creator = new AmorDrugCreator();
System.out.println(drug.getName()+"的成分是:");
System.out.println(drug.getConstitute());
}
}
五、执行结果
