JAVA设计模式之工厂模式

工厂模式概念:

实例化对象,用工厂方法代替new操作

工厂模式包括工厂方法模式和抽象工厂模式

抽象工厂模式是工厂方法模式的扩展

工厂模式的意图:

定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化。

工厂方法把实例化的工作推迟到子类中实现

什么情况下适合工厂模式:

         有一组类似的对象需要创建

         在编码时不能预见需要创建哪种类的实例

         系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节

工厂模式的动机:

         项目中的现状:在软件系统中经常面临着“对象”的创建工作,由于需求的变化,这个对象可能随之也会发生改变,但它却拥有比较稳定的接口。为此,我们需要提供一种封装机制来隔离出这个易变对象的变化,从而保持系统中其他依赖该对象不随着需求变化而变化。(做到低耦合)

 

 

基于项目现状将代码进行如下设计:

         尽量松耦合,一个对象的依赖对象的变化与本身无关

         具体产品与客户端剥离,责任分割

工厂方法模式和抽象工厂模式对比:

  1. 1.              工厂模式是一种极端情况的抽象工厂模式,而抽象工厂模式可以看成是工厂模式的推广
  2. 2.              工厂模式用来创建一个产品的等级结构,而抽象工厂模式是用来创建多个产品的等级结构
  3. 3.              工厂模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类

工厂模式的实现帮助我们:

  1. 1.       系统可以在不修改具体工厂角色的情况下引进新的产品
  2. 2.       客户端不必关心对象如果创建,明确了职责
  3. 3.       更好的理解面向对象的原则、面向接口编程,而不是面向实现编程

工厂模式代码示例

1.创建接口

1 1 /**
2 2  * 发型接口
3 3  * **/
4 4 public interface HairInterface {
5 5     //实现了发型
6 6     public void draw();
7 7 }
View Code

2.实现接口

 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 }
View Code

3.创建配置文件

4.读取配置文件,并返回一个map

 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 }
View Code

5.创建一个工厂,让工厂来创建对象

 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 }
View Code

6.测试类

 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 }
View Code
原文地址:https://www.cnblogs.com/wwzyy/p/4959976.html