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

  工厂模式涉及四种角色:

    抽象产品(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]+"毫克\n";
this.part2 = "每粒含有"+this.part2+a[1]+"毫克\n";
this.part3 = "每粒含有"+this.part3+a[2]+"毫克\n";
this.part4 = "每粒含有"+this.part4+a[3]+"毫克\n";
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]+"毫克\n";
this.part2 = "每粒含有"+this.part2+a[1]+"毫克\n";
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());
}
}

  

最新文章

  1. HTTP Request Method共计15种
  2. WPF之命名空间和资源
  3. ad bga扇出 和群组布线
  4. Unity手游之路<三> 基于Unity+Java的聊天室源码
  5. IPC进程通信机制
  6. Egit Patch
  7. Memory Barriers ,cache-coherency
  8. 在eclipse中生成html注释文档
  9. 深入WSGI,并按样例实现一个
  10. ArrayList的深度copy和浅度拷贝
  11. jquery validation remote depends 验证触发条件
  12. IT行业为什么没有进度
  13. Java:final、static关键字 详解+两者结合使用
  14. 【Python学习笔记之一】Python关键字及其总结
  15. 4年前端、2年CTO:一个非科班程序员的真实奋斗史
  16. netstat lsof ps 常用场景
  17. C++学习笔记56:异常处理
  18. shell语法使用
  19. angular的uiRouter服务学习(3)
  20. pycharm 使用激活补丁永久激活+汉化

热门文章

  1. vue文件中提示Expected Boolean, got String
  2. 国内Archlinux arm的镜像源
  3. [TJOI2019]甲苯先生和大中锋的字符串——后缀自动机+差分
  4. java1.8 lambda进行并行运算
  5. 走进JavaWeb技术世界13:Hibernate入门经典与注解式开发
  6. git补充(关于pull request)转自知乎
  7. Java 面向对象(四)
  8. Dataeye计算任务架构
  9. MySQL 8.0: From SQL Tables to JSON Documents (and back again)
  10. AndroidStudio制作Nine-Patch【.9】图片