JAVA设计模式之工厂模式
工厂模式概念:
实例化对象,用工厂方法代替new操作
工厂模式包括工厂方法模式和抽象工厂模式
抽象工厂模式是工厂方法模式的扩展
工厂模式的意图:
定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化。
工厂方法把实例化的工作推迟到子类中实现
什么情况下适合工厂模式:
有一组类似的对象需要创建
在编码时不能预见需要创建哪种类的实例
系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节
工厂模式的动机:
项目中的现状:在软件系统中经常面临着“对象”的创建工作,由于需求的变化,这个对象可能随之也会发生改变,但它却拥有比较稳定的接口。为此,我们需要提供一种封装机制来隔离出这个易变对象的变化,从而保持系统中其他依赖该对象不随着需求变化而变化。(做到低耦合)
基于项目现状将代码进行如下设计:
尽量松耦合,一个对象的依赖对象的变化与本身无关
具体产品与客户端剥离,责任分割
工厂方法模式和抽象工厂模式对比:
- 1. 工厂模式是一种极端情况的抽象工厂模式,而抽象工厂模式可以看成是工厂模式的推广
- 2. 工厂模式用来创建一个产品的等级结构,而抽象工厂模式是用来创建多个产品的等级结构
- 3. 工厂模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类
工厂模式的实现帮助我们:
- 1. 系统可以在不修改具体工厂角色的情况下引进新的产品
- 2. 客户端不必关心对象如果创建,明确了职责
- 3. 更好的理解面向对象的原则、面向接口编程,而不是面向实现编程
工厂模式代码示例
1.创建接口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 1 /** 2 2 * 发型接口 3 3 * **/ 4 4 public interface HairInterface { 5 5 //实现了发型 6 6 public void draw(); 7 7 }
2.实现接口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /** 2 * 实现接口*/ 3 public class LeftHair implements HairInterface{ 4 @Override 5 public void draw() { 6 System.out.println("LeftHair......"); 7 } 8 } 9 public class RightHair implements HairInterface{ 10 @Override 11 public void draw() { 12 System.out.println("RightHair......"); 13 } 14 }
3.创建配置文件
4.读取配置文件,并返回一个map
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class PropertiesReader { 2 public Map<String, String> getProperties(){ 3 Properties props = new Properties(); 4 Map<String, String> map = new HashMap<String, String>(); 5 try{ 6 InputStream in = getClass().getResourceAsStream("type.properties"); 7 props.load(in); 8 Enumeration en = props.propertyNames(); 9 while(en.hasMoreElements()){ 10 String key = (String)en.nextElement(); 11 String property = props.getProperty(key); 12 map.put(key, property); 13 } 14 }catch(Exception e){ 15 e.printStackTrace(); 16 } 17 return map; 18 } 19 }
5.创建一个工厂,让工厂来创建对象
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class HairFactory { 2 /** 3 * 根据类型来创建对象*/ 4 public HairInterface getHair(String key){ 5 if("left".equals(key)){ 6 return new LeftHair(); 7 }else if("right".equals(key)){ 8 return new RightHair(); 9 } 10 return null; 11 } 12 /** 13 * 根据类的名称来生产对象 14 * */ 15 public HairInterface getHairByClass(String classname){ 16 try { 17 HairInterface hair = (HairInterface) Class.forName(classname).newInstance(); 18 return hair; 19 } catch (InstantiationException e) { 20 e.printStackTrace(); 21 } catch (IllegalAccessException e) { 22 e.printStackTrace(); 23 } catch (ClassNotFoundException e) { 24 e.printStackTrace(); 25 } 26 27 return null; 28 } 29 /** 30 * 根据索引来产生对象*/ 31 public HairInterface getHairByClasskey(String key){ 32 try { 33 //得到map映射 34 Map<String, String> map = new PropertiesReader().getProperties(); 35 //根据键得到值 36 HairInterface hair = (HairInterface) Class.forName(map.get(key)).newInstance(); 37 return hair; 38 } catch (InstantiationException e) { 39 e.printStackTrace(); 40 } catch (IllegalAccessException e) { 41 e.printStackTrace(); 42 } catch (ClassNotFoundException e) { 43 e.printStackTrace(); 44 } 45 46 return null; 47 } 48 49 }
6.测试类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class Test { 2 public static void main(String[] args) { 3 // HairInterface left = new LeftHair(); 4 // left.draw(); 5 // HairInterface right = new RightHair(); 6 // right.draw(); 7 // 8 // HairInterface left = new HairFactory().getHair("left"); 9 // left.draw(); 10 // HairInterface right = new HairFactory().getHairByClass("com.wzy.Factory_model.RightHair"); 11 // right.draw(); 12 /**根据 13 * 14 * 利用配置文件,根据索引来得到对象**/ 15 HairInterface hair = new HairFactory().getHairByClasskey("in"); 16 hair.draw(); 17 } 18 }
本文来自博客园,作者:wzyy,转载请注明原文链接:https://www.cnblogs.com/wwzyy/p/4959976.html