工厂模式

定义一个用于创建对象的接口,让子类决定实例化哪一个类。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());
    }
}

 优势:用户可以不必知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法。

适用情景:用户需要一个类的子类实例,但不希望与该类的子类形成耦合

     用户需要一个类的子类实例,但用户不知道到该类有那些子类可用

posted @ 2020-04-23 10:39  blank000  阅读(184)  评论(0)    收藏  举报