博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
创建型模式-工厂模式
阅读量:5008 次
发布时间:2019-06-12

本文共 4234 字,大约阅读时间需要 14 分钟。

工厂模式的意图:

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

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

什么情况下适合工产模式;

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

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

3系统需要考虑扩展性,不应依赖产品类实例如何被创建,组合和表达的细节;(会有新的需求);

项目的现状:

在软件系统中经常面临着“对象”的创建工作。,,由于需求的变化,这个对象可能会随之变化,但它却拥有比较稳定的接口;

为此,我们需要提供一种封装机制来隔离出这个易变对象的变化,从而保持系统中其他依赖该对象的对象不随着需求变化而变化。

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

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

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

       

代码的实现如下:

HairIntenface.java

1 package ff;2 /*3  * 创建一个接口来实现发型这一系列的产品;4  * 5  * */6 public interface HairInterface {7     public void draw();8 }
View Code

 LeftHair.java

1 package ff; 2  3 public class LeftHair implements HairInterface { 4     /* 5     * 6     *生产了一个左偏分发型; 7     */ 8     @Override 9     public void draw() {10          System.out.println("----------左偏分发型-----------");11 12     }13 14 }
View Code

RightHair.java

1 package ff; 2  3 public class RightHair implements HairInterface { 4      /* 5     * 6     *画了一个右偏分发型; 7     */ 8     @Override 9     public void draw() {10         // TODO Auto-generated method stub11          System.out.println("----------右偏分发型-----------");12     }13 14 }
View Code

 PropertiesReader.java

package ff;import java.io.InputStream;import java.util.Enumeration;import java.util.HashMap;import java.util.Map;import java.util.Properties;/** * properties文件的读取工具 * @author Administrator * */public class PropertiesReader {        public Map
getProperties() { Properties props = new Properties(); Map
map = new HashMap
(); try { InputStream in = getClass().getResourceAsStream("type.properties"); props.load(in); Enumeration en = props.propertyNames(); while (en.hasMoreElements()) { String key = (String) en.nextElement(); String property = props.getProperty(key); map.put(key, property);// System.out.println(key + " " + property); } } catch (Exception e) { e.printStackTrace(); } return map; }}
View Code

在包下创建一个type.properties

left=ff.LeftHair

right=ff.RightHair  

写上以上内容,这主要是根据参数找到相对应类的路径;

Hairfactory.java

package ff;import java.util.Map;public class Hairfactory {    public HairInterface getHair(String key){        if(key.equals("left")){            return new LeftHair();        }else if(key.equals("right")){            return new RightHair();        }else{            return null;        }    }    /*根据类的名称来创建对象*/    public HairInterface getHairByClass(String className){                try {            HairInterface hair = (HairInterface) Class.forName(className).newInstance();            return hair;        } catch (InstantiationException e) {                        e.printStackTrace();        } catch (IllegalAccessException e) {                        e.printStackTrace();        } catch (ClassNotFoundException e) {                        e.printStackTrace();        }        return null;                    }    /*根据传递过来的参数,来调用相应的类;写一个key value 相对应的类*/    public HairInterface getHairByClassKey(String key){                try {            Map
map = new PropertiesReader().getProperties(); HairInterface hair = (HairInterface) Class.forName(map.get(key)).newInstance(); return hair; } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; }}
View Code

 

test.java

package ff;public class test {    /**     * @param args     */    public static void main(String[] args) {        // 这是最原始的调用方法;        //HairInterface left = new LeftHair();        //left.draw();        Hairfactory factory = new Hairfactory();        //用参数来调用        //HairInterface left = factory.getHair("left");        //left.draw();        //根据反射来调用类,实例化类        //HairInterface left= factory.getHairByClass("ff.LeftHair");        //left.draw();        //在写类名很麻烦时,调用的参数        HairInterface left= factory.getHairByClassKey("left");        left.draw();            }}
View Code

 

 

  

转载于:https://www.cnblogs.com/zht0915/p/4638666.html

你可能感兴趣的文章
get_free_page 和其友
查看>>
REVOKE - 删除访问权限
查看>>
解决UICollectionView的Cell复用引起的布局混乱问题
查看>>
校外实习报告(九)
查看>>
android之android.intent.category.DEFAULT的用途和使用
查看>>
CAGradientLayer 透明渐变注意地方(原创)
查看>>
【OpenSource】--Web Bench 1.5
查看>>
python-1:工欲善其事,必先利其器 安装配置Anaconda x32位 更新后,启动不了,解决方案(亲测)...
查看>>
Linux 命令(二) Linux下查看文件文件内容命令
查看>>
ubuntu系统如何屏幕截图
查看>>
ArcGIS Engine 创建索引(属性索引)——提高查询效率
查看>>
栅格数据AE
查看>>
开发笔记
查看>>
织梦DEDE多选项筛选_联动筛选功能的实现_二次开发
查看>>
SQL Server 排名函数 简单应用
查看>>
Could not find file "/var/www/default/bin\roslyn\csc.exe".
查看>>
关于软件工程的疑问
查看>>
iOS关于RunLoop和Timer
查看>>
SQL处理层次型数据的策略对比:Adjacency list vs. nested sets: MySQL【转载】
查看>>
已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中。
查看>>