设计模式-工厂模式

PS:一天一个设计模式复习,下了个怪怪的STARUML,类图有所区别,仅供自己温习把。

1.模式结构

工厂方法模式结构类图如图1.1所示(图中圆圈代表接口)
工厂模式类图

2.模式分析

工厂模式是简单工厂模式的进一步抽象和推广。在工厂模式中,核心的工厂类不再负责所有产品的创建,而是将具体的创建工作交给子类去做。例如现实生活中的手机工厂,华为生产华为手机,魅族生产魅族手机,那么抽象层的公司生产抽象的手机,具体的手机公司就生产具体品牌的手机。

3.实例解析

某手机厂专为各知名手机机品牌代工生产各种手机,当需要华为机时只需要调用该工厂的工厂方法时传入参数HuaWei,需要魅族时只需要传入参数MeiZu.
工厂模式类图2
(1)抽象产品类phone

public interface phone {
   public void open();
}

(2)具体产品类HuaWei,MeiZu

public class HuaWei implements phone{
    @Override
    public void open() {
        System.out.println("华为手机开机中.....");
    }
}
public class MeiZu implements phone{

    @Override
    public void open() {
        System.out.println("华为手机开机中.....");
    }

}

(3)抽象工厂类

public interface phoneFactory {
    public phone producePhone();
}

(4)具体工厂类

public class HuaWeiFactory implements phoneFactory{
    @Override
    public phone producePhone() {
        System.out.println("生产华为的手机");
        return new HuaWei();
    }
}
public class MeiZuFactory implements phoneFactory {
    @Override
    public phone producePhone() {
        System.out.println("生产魅族的手机");
        return new MeiZu();
    }
}

(5)客户端测试类client

public class client {
        public static void main(String args[]) throws Exception{
            phone phone;
            phoneFactory factory;
            factory = (phoneFactory) XMLUtil.getBean(); 
            phone = factory.producePhone();
            phone.open();
        }
}

(6)工具类–用于获取工厂实例对象

public class XMLUtil {
     public static Object getBean() throws Exception{
         //创建dom对象
         DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
         DocumentBuilder builder = dFactory.newDocumentBuilder();
         Document doc = builder.parse("D:/config.xml");

         //获取包含类名的文本节点
         NodeList nl = doc.getElementsByTagName("className");
         Node classNode = nl.item(0).getFirstChild();
         String cname = classNode.getNodeValue();

        /*  String packageName = new ShapeFactory().getClass().getPackage().getName();
          return (Shape) Class.forName(packageName + "." + className).newInstance();  获取包名*/

         //通过类名产生实例对象并返回
         String packageName = "Factory_Model.";
         cname = packageName + cname;     //对反射研究不深,所以先用文本的方式 将包名和类名拼接,如果你创建的工程没有包名,可以省略

         @SuppressWarnings("rawtypes")
         Class c = Class.forName(cname);
         Object obj = c.newInstance();

         return obj;
     }
}

(7)配置文件config.xml

<?xml version="1.0"?>
<config>
    <className>HuaWeiFactory</className>
</config>

4.输出结果

输出结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值