• Java的设计模式(3)--工厂模式


      工厂模式是定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。

      工厂模式涉及四种角色:

        抽象产品(Product):抽象类或者接口,负责定义具体产品必须实现的方法;

        具体产品(ConcreteProduct):具体产品是一个类,是抽象产品的具体实现类;

        构造者(Creator):一个接口或者抽象类,构造者定义一个称作工厂方法的抽象方法,该方法返回具体产品类的实例;

        具体构造者(ConcreteCreator):是构造者的具体实现,具体构造者会重写工厂方法,使该方法返回具体产品的实例。

      其UML类图大概如下:

    工厂方法模式优点:

      1.使用工厂方法可以让用户的代码和某个特定类的子类代码解耦

      2.工厂方法使用户不必知道它所使用的对象是怎样被创建的,只需要知道该对象有哪些方法即可。

    使用场景:

      用户需要一个类的子类实例但是不希望与子类耦合,或者用户不知道该类有哪些子类可以用

    下面举个例子:创建药品对象

      目前按照药品的规定设计一个抽象类Drug(),该抽象类特别规定了药品必须的成分和含量。Paracetamol子类创建安加黄敏一类的药品,Amorolfine创建盐酸阿莫罗芬一类的药品。药店开发的应用程序需要Drug子类实例向药店提供药品,因为药店没有能力给出药品各个成分的含量,药厂才可以,所以不能用Drug子类构造方法直接创建对象。

      抽象产品:Drug类是药的统称,是药的抽象类,代码如下:

    public abstract class drug{
        String constitute;
        String name;
        public String getName(){
           return name;
        }
        public String getConstitute(){
           return constitute;
        }
    }

      具体产品:Amorolfine和Paracetamol是两个具体的产品,代码如下

    public class Paracetamol extends Drug{
        String part1 = "乙酰氨基酚";
        String part2 = "咖啡因";
        String part3 = "人工牛黄";
        String part4 = "马来酸氯苯";
        public Paracetamol (String name,int[] a){
             this.name = name;
             this.part1 = "每粒含有"+this.part1+a[0]+"毫克
    ";
             this.part2 = "每粒含有"+this.part2+a[1]+"毫克
    ";
             this.part3 = "每粒含有"+this.part3+a[2]+"毫克
    ";
             this.part4 = "每粒含有"+this.part4+a[3]+"毫克
    ";
    this.
    constitute = this.part1 + this.part2 + this.part3 + this.part4;
          } 
    }
    public class Amorolfineextends Drug{
        String part1 = "甲硝锉";
        String part2 = "人工牛黄";
        public Amorolfine(String name,int[] a){
             this.name = name;
             this.part1 = "每粒含有"+this.part1+a[0]+"毫克
    ";
             this.part2 = "每粒含有"+this.part2+a[1]+"毫克
    ";
    this.constitute = this.part1 + this.part2; } }

      构造者:构造者接口DrugCreator:

    public interface DrugCreator{
        public abstract Drug getDrug();//工厂方法
    }

      具体构造者:ParaDrugCreator和AmorDrugCreator是两个具体构造者角色,代码如下

      

    public class ParaDrugCreator implements DrugCreator{
        public Drug getDrug(){
            int[] a = {250,15,1,10};
            Drug drug = new Paracetamol("安加黄敏胶囊",a);
            return drug;
        } 
    }
    public class AmorDrugCreator implements DrugCreator{
        public Drug getDrug(){
            int[] a = {200,5};
            Drug drug = new Amorolfine("甲硝锉胶囊",a);
            return 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());
          }
    }

      

  • 相关阅读:
    Web开发者需具备的8个好习惯
    全球十大搜索引擎排名
    ContextWrapper
    PackageManager
    重写equals方法的注意事项
    StackOverflow 并不只是一个问答网站
    android 中ids.xml资源的使用
    The method dismissDialog(int) from the type Activity is deprecated
    百度员工离职总结:如何做个好员工?
    Mysql 自动化任务
  • 原文地址:https://www.cnblogs.com/wangyongwen/p/11210007.html
Copyright © 2020-2023  润新知