Java设计模式编程中简单工厂与抽象工厂模式的使用实例

 更新时间:2016年04月21日 09:56:51   作者:匆忙拥挤repeat  
这篇文章主要介绍了Java设计模式编程中简单工厂与抽象工厂模式的使用实例,简单工厂与抽象工厂都可以归类于设计模式中的创建型模式,需要的朋友可以参考下

简单工厂模式
类图

201642195447625.jpg (966×712)

通过一个工厂类,以一个条件来创建对应的对象

//业务功能 
public interface ICalculation { 
  double getResult(double numA, double numB); 
} 

public class CalcAdd implements ICalculation { 
 
  @Override 
  public double getResult(double numA, double numB) { 
    System.out.println("加法"); 
    return numA + numB; 
  } 
 
} 

public class CalcSubtract implements ICalculation { 
 
  @Override 
  public double getResult(double numA, double numB) { 
    System.out.println("减法"); 
    return numA - numB; 
  } 
 
} 

/* 
 * 简单工厂模式 关注:对象的创建 
 * 建立一个工厂类,对实现了同一接口的或者是存在继承关系的一些类进行实例的创建 
 */ 
public class Test4Simple { 
  public static void main(String[] args) { 
//   String operation = "/"; 
    String operation = "+"; 
//   String operation = "-"; 
//   String operation = "*"; 
    double numA = 182, numB = 33; 
    ICalculation createCalc = CalcSimpleFactory.createCalc(operation); 
    double result = createCalc.getResult(numA, numB); 
    System.out.println(result); 
  } 
} 

简单工厂的缺陷: 简单工厂创建产品时需要传递相应的参数,如果传递不正确就取不到对象了。
改进:多方法创建不同产品
类图

201642195519770.jpg (926×736)

public class CalcMultipleFactory { 
   
  public static ICalculation produceAdd() { 
    return new CalcAdd(); 
  } 
   
  public static ICalculation produceSubtract() { 
    return new CalcSubtract(); 
  } 
   
  public static ICalculation produceMultiply() { 
    return new CalcMultiply(); 
  } 
   
  public static ICalculation produceDivide() { 
    return new CalcDivide(); 
  } 
} 

public class Test4Multiple { 
 
  public static void main(String[] args) { 
    double numA = 182, numB = 33; 
     
    ICalculation createCalc = CalcMultipleFactory.produceAdd(); 
    double result = createCalc.getResult(numA, numB); 
    System.out.println(result); 
     
    createCalc = CalcMultipleFactory.produceSubtract(); 
    result = createCalc.getResult(numA, numB); 
    System.out.println(result); 
     
    createCalc = CalcMultipleFactory.produceMultiply(); 
    result = createCalc.getResult(numA, numB); 
    System.out.println(result); 
     
    createCalc = CalcMultipleFactory.produceDivide(); 
    result = createCalc.getResult(numA, numB); 
    System.out.println(result); 
  } 
} 

抽象工厂模式
里面有几个概念:抽象工厂、实体工厂、抽象产品、实体产品
抽象工厂:定义创建产品的抽象方法
实体工厂:具体的创建哪种产品
抽象产品:一个接口或基类
实体产品:实现具体功能,或派生
类图

201642195549773.jpg (1396×882)

//抽象产品1 
public interface IProduct1 { 
  public void show(); 
} 

//抽象产品2 
public interface IProduct2 { 
  public void show(); 
} 

//实体产品1 
public class Product1 implements IProduct1 {  
  public void show() {  
    System.out.println("创建了1型产品");  
  }  
}  

//实体产品2 
public class Product2 implements IProduct2 { 
  public void show() { 
    System.out.println("创建了2型产品"); 
  } 
} 

/* 
 * 1A 1B属于Product1 同一产品等级结构中 
 * 2A 2B属于Product2 
 */ 
public class GradeProduct1A extends Product1 { 
 
  @Override 
  public void show() { 
    super.show(); 
    System.out.println("这是产品1下的:产品A"); 
  } 
   
} 

public class GradeProduct1B extends Product1 { 
 
  @Override 
  public void show() { 
    super.show(); 
    System.out.println("这是产品1下的:产品B"); 
  } 
} 

public class GradeProduct2A extends Product2 { 
 
  @Override 
  public void show() { 
    super.show(); 
    System.out.println("这是产品2下的:产品A"); 
  } 
} 

public class GradeProduct2B extends Product2 { 
 
  @Override 
  public void show() { 
    super.show(); 
    System.out.println("这是产品2下的:产品B"); 
  } 
} 

//抽象工厂 创建不同的抽象产品 
public interface IFactory { 
  public IProduct1 createProduct1A();//1类产品 型号A 
  public IProduct1 createProduct1B();//1类产品 型号B 
  public IProduct2 createProduct2A();//2类产品 型号A 
  public IProduct2 createProduct2B();//2类产品 型号B 
} 

//实体工厂 创建实体产品,返回类型为抽象产品 
public class Factory implements IFactory { 
 
  public IProduct1 createProduct1A() { 
    return new GradeProduct1A(); 
  } 
 
  public IProduct1 createProduct1B() { 
    return new GradeProduct1B(); 
  } 
 
  public IProduct2 createProduct2A() { 
    return new GradeProduct2A(); 
  } 
 
  public IProduct2 createProduct2B() { 
    return new GradeProduct2B(); 
  } 
} 

/* 
 * 抽象工厂模式:用来创建一组相关或者相互依赖的对象 
 * 
 * 流程:抽象工厂,实体工厂   生产产品 
 *   抽象产品,实体产品    实现产品功能 
 * 缺点:当需要增加一个产品(由抽象和实体构成),工厂都需要更改 
 */ 
public class Test4Abstract { 
  public static void main(String[] args) { 
    IFactory factory = new Factory(); 
    IProduct1 product1a = factory.createProduct1A(); 
    product1a.show(); 
    IProduct1 product1b = factory.createProduct1B(); 
    product1b.show(); 
     
    IProduct2 product2a = factory.createProduct2A(); 
    product2a.show(); 
    IProduct2 product2b = factory.createProduct2B(); 
    product2b.show(); 
  } 
} 

相关文章

  • Java并发编程中构建自定义同步工具

    Java并发编程中构建自定义同步工具

    这篇文章主要介绍了Java并发编程中构建自定义同步工具,本文讲解了可阻塞状态依赖操作的结构、有界缓存实现基类示例、阻塞实现方式一:抛异常给调用者、阻塞实现方式二:通过轮询和休眠、阻塞实现方式三:条件队列等内容,需要的朋友可以参考下
    2015-04-04
  • java中堆和栈的区别分析

    java中堆和栈的区别分析

    这篇文章主要介绍了java中堆和栈的区别,分析了Java中堆和栈的原理及使用时的注意事项,需要的朋友可以参考下
    2014-09-09
  • SpringBoot详解Banner的使用

    SpringBoot详解Banner的使用

    这篇文章主要介绍了超个性修改SpringBoot项目的启动banner的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • java单链表逆序用法代码示例

    java单链表逆序用法代码示例

    这篇文章主要介绍了java单链表逆序用法代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 关于Future机制原理及解析

    关于Future机制原理及解析

    这篇文章主要介绍了关于Future机制原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java通过URL获取公众号文章生成HTML的方法

    Java通过URL获取公众号文章生成HTML的方法

    这篇文章主要介绍了Java通过URL获取公众号文章生成HTML的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • maven package 打包报错 Failed to execute goal的解决

    maven package 打包报错 Failed to execute goal的解决

    这篇文章主要介绍了maven package 打包报错 Failed to execute goal的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Selenium+Tesseract-OCR智能识别验证码爬取网页数据的实例

    Selenium+Tesseract-OCR智能识别验证码爬取网页数据的实例

    本文主要介绍了Selenium+Tesseract-OCR智能识别验证码爬取网页数据,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • springboot整合JPA过程解析

    springboot整合JPA过程解析

    这篇文章主要介绍了springboot整合JPA过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • mybatis查询语句揭秘之参数解析

    mybatis查询语句揭秘之参数解析

    这篇文章主要给大家介绍了关于mybatis查询语句之参数解析的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mybatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04

最新评论