工厂模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
一个为某药店开发的应用程序需要使用Drug类的某个子类的实例为用户提供药品,
但是药店的应用程序不能使用Drug的子类的构造方法直接创建对象,因为药店没有能力
给出药品的各个成分的含量,只有药厂才有这样的能力。
请使用工厂方法模式为已有系统编写一个抽象类,并在其中定义工厂方法,该工厂方返
回Drug类的子类的实例。
抽象成品角色
public abstract class Drug { String constitute; String name; //定义获得名字的方法 public String getName(){ return name; } //定义获得成分的方法 public String getConstitute(){ return constitute; } }
两个具体产品角色
public class Paracetamol extends Drug{ String part1 = "每粒含乙酰氨基酚"; String part2 = "每粒含咖啡因"; String part3 = "每粒含人工牛黄"; String part4 = "每粒含马来酸氯苯"; //定义Paracetamol构造方法 public Paracetamol(String name,int [] a){ this.name = 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; } }
public class Amorolfine extends Drug{ String part1 = "每粒含甲硝锉"; String part2 = "每粒含人工牛黄"; //定义Amorolfine构造方法 public Amorolfine(String name,int [] a){ this.name = name;//获取name part1 = part1 +":"+a[0]+"毫克\n"; part2 = part2 +":"+a[1]+"毫克\n"; constitute = part1 + part2;//成分为两者相加 } }
构造角色的接口
public interface DrugCreator { //定义抽象方法getDrug() public abstract Drug getDrug(); }
具体构造者角色
public class ParaDrugCreator implements DrugCreator{ //重写getDrug()方法 public Drug getDrug(){ int [] a = {250,15,1,10}; //实例化drug Drug drug = new Paracetamol("氯加黄敏胶囊",a); return drug;//返回drug } }
public class AmorDrugCreator implements DrugCreator{ //重写getDrug()方法 public Drug getDrug(){ int [] a = {200,5}; //实例化drug Drug drug = new Amorolfine("甲硝锉胶囊",a); return drug;//返回drug } }
应用程序
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(); drug = creator.getDrug(); System.out.println(drug.getName()+"的成分:"); System.out.println(drug.getConstitute()); } }
优势:用户可以不必知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法。
适用情景:用户需要一个类的子类实例,但不希望与该类的子类形成耦合
用户需要一个类的子类实例,但用户不知道到该类有那些子类可用

浙公网安备 33010602011771号