二、创建型模式——工厂模式

来源:互联网 发布:编制软件 编辑:程序博客网 时间:2024/05/16 08:52

对象的创建会消耗掉系统的很多资源,所以单独对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题

工厂模式:

这里写图片描述
以下是要创建的产品的类:

/** * 需要的产品接口 * @author ZhangJiaMin */public interface ProductInterface {    //实现了产品功能    public void doIt();}
/** * 产品_1_1 * @author ZhangJiaMin */public class Product_1_1 implements ProductInterface {    @Override    public void doIt() {        System.out.println("Product_1_1");    }}
/** * 产品_1_2 * @author ZhangJiaMin */public class Product_1_2 implements ProductInterface {    @Override    public void doIt() {        System.out.println("Product_1_2");    }}

工厂类:

import java.util.Map;public class ProductFactory {    /**     * 根据需求创建同一接口下的不同对象     * @param key     * @return     */    public ProductInterface getProductByClasskey(String key){        try {            Map<String,String> map = new PropertiesReader().getProperties();            ProductInterface product = (ProductInterface) Class.forName(map.get(key)).newInstance();            return product;        } catch (InstantiationException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IllegalAccessException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (ClassNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return null;    }}

此处以properties文件避免输入过长包名:

Product_1_1=\u5DE5\u5382\u6A21\u5F0F.\u5DE5\u5382\u6A21\u5F0F.Product_1_1Product_1_2=\u5DE5\u5382\u6A21\u5F0F.\u5DE5\u5382\u6A21\u5F0F.Product_1_2

再以PropertiesReader将Properties文件读取为Map集合:

package 工厂模式.工厂模式;import java.io.InputStream;import java.util.Enumeration;import java.util.HashMap;import java.util.Map;import java.util.Properties;public class PropertiesReader {    public Map<String, String> getProperties() {        Properties props = new Properties();        Map<String, String> map = new HashMap<String, String>();        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;    }}

以下是测试方法:调用工厂对象生产产品

package 工厂模式.工厂模式;public class Test {    public static void main(String[] args) {        ProductFactory productfactory =new ProductFactory();        ProductInterface product_interface = productfactory.getProductByClasskey("Product_1_1");        product_interface.doIt();    }}

抽象工厂模式:

这里写图片描述

系列的实现接口:

package 工厂模式.抽象工厂模式;/** * 系列的实现接口 * @author ZhangJiaMin * */public interface SeriesFactory {    //系列一接口    public Series_1 getSeries_1();    //系列二接口    public Series_2 getSeries_2();}

产品系列1的接口及产品:

package 工厂模式.抽象工厂模式;/** * 产品系列1 * @author ZhangJiaMin * */public interface Series_1 {    public void do_1();}
package 工厂模式.抽象工厂模式;public class Series_1_1 implements Series_1 {    @Override    public void do_1() {        System.out.println("第一个系列的1类产品");    }}
package 工厂模式.抽象工厂模式;public class Series_1_2 implements Series_1 {    @Override    public void do_1() {        System.out.println("第一个系列的2类产品");    }}

产品系列2的接口及产品:

package 工厂模式.抽象工厂模式;/** * 产品系列2 * @author ZhangJiaMin * */public interface Series_2 {    public void do_2();}
package 工厂模式.抽象工厂模式;public class Series_2_1 implements Series_2 {    @Override    public void do_2() {        System.out.println("第二个系列的1类产品");    }}
package 工厂模式.抽象工厂模式;public class Series_2_2 implements Series_2 {    @Override    public void do_2() {        System.out.println("第二个系列的2类产品");    }}

一类产品工厂:

package 工厂模式.抽象工厂模式;/** * 一类产品接口 * @author ZhangJiaMin * */public class Class_1Factory implements SeriesFactory {    @Override    public Series_1 getSeries_1() {        // TODO Auto-generated method stub        return new Series_1_1();    }    @Override    public Series_2 getSeries_2() {        // TODO Auto-generated method stub        return new Series_2_1();    }}

二类产品工厂:

package 工厂模式.抽象工厂模式;/** * 一类产品接口 * @author ZhangJiaMin * */public class Class_2Factory implements SeriesFactory {    @Override    public Series_1 getSeries_1() {        // TODO Auto-generated method stub        return new Series_1_2();    }    @Override    public Series_2 getSeries_2() {        // TODO Auto-generated method stub        return new Series_2_2();    }}

测试及调用:

package 工厂模式.抽象工厂模式;public class Test {    public static void main(String[] args) {        Class_1Factory factory = new Class_1Factory();        Series_1 series_1=factory.getSeries_1();        series_1.do_1();    }}
0 0
原创粉丝点击