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

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

  hot3.png

1、工厂模式概念:

    实例化对象,用工厂方法替代new操作。
    工厂模式包括工厂方法模式和抽象工厂模式。
    抽象工厂模式时工厂方法的拓展。
生活中的工厂:洗漱,上班。。。

2、工厂模式的意图:

    定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化。
    工厂方法把实例化的工作推迟到子类中实现。

3、什么情况下适合工厂模式?

    ·有一组类似的对象需要创建。
    ·在编码时不能预见需要创建哪种类的实例。
    (比如,商店今天引进苹果,香蕉,但是不能预见以后会引进什么品种)
    ·系统需要考虑拓展性,不应依赖于产品实例如何被创建、组合和表达的细节。

4、工厂模式的动机

项目中的现状:
    在软件系统中经常面临这“对象”的创建工作,由于需求的变化,这个随行
可能随之也会发生变化,但它却拥有比较稳定的接口。
    为此,我们需要提供一种封装机制来隔离出来这个易变对象的变化,从而保持
系统中其他依赖该对象的对象不随着需求变化而变化。
5、基于项目现状将代码进行如下设计:
    1、尽量松耦合,一个对象的依赖对象的变化与本身无关。
    2、具体产品与客户端剥离,责任分割。

HairFactory.java

package imooc.factory;import java.util.Map;/** * 发型工厂 * @author 81488 * */public class HairFactory {	/**	 * 根据类型来创建对象	 * @param key	 * @return	 * 	 * 缺点:不够智能,每增加一个类型需要添加else if进行再判断	 */	public HairInterface getHair(String key){		if("left".equals(key)){			return new LeftHair();		}else if("right".equals(key)){			return new RightHair();		}			return null;			}		/**	 * 根据类的名称来产生对象(反射机制)	 * @param className	 * @return	 */		//实现映射:再配置文件中用键值对来实现类名和简写的映射	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) { // 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; }}

HairInterface.java

package imooc.factory;/** * 发型接口 * @author 81488 * */public interface HairInterface {	//实现了发型	public void draw();}

InHair.java

package imooc.factory;/** * 中分发型 * @author 81488 * */public class InHair implements HairInterface {	@Override	public void draw() {		// TODO Auto-generated method stub		System.out.println("------中分发型-----");	}}

LeftHair.java

package imooc.factory;/** * 画了一个左偏分发型 * @author 81488 * */public class LeftHair implements HairInterface {	@Override	public void draw() {		// TODO Auto-generated method stub		System.out.println("------左偏分发型-----");	}}

RightHair.java

package imooc.factory;/** * 右偏分发型 * @author 81488 * */public class RightHair implements HairInterface {	@Override	public void draw() {		// TODO Auto-generated method stub		System.out.println("------右偏分发型--------");	}}

type.properties

left=imooc.factory.LeftHairright=imooc.factory.RightHairin=imooc.factory.InHair

test.java

package imooc.factory;/** * 模拟客户端实现 * @author 81488 * */		public class test {	public static void main(String[] args) {//		HairInterface left  = new LeftHair();//		left.draw();				HairFactory factory = new HairFactory();//		HairInterface left = factory.getHair("left");//		left.draw();				//利用类名get对象来创建//		HairInterface left = factory.getHairByChass("imooc.factory.LeftHair");//		left.draw();				HairInterface hair = factory.getHairByClassKey("in");		hair.draw();	}		}

 

转载于:https://my.oschina.net/8824/blog/1580478

你可能感兴趣的文章
我所经历的前端开发变化
查看>>
fio测试nvme性能
查看>>
node常用模块---path
查看>>
WebSocket于HTTP 、WebSocket与Socket的区别
查看>>
xpath与css的区别
查看>>
Java ClassLoader分析
查看>>
SharePoint 2010 上下左右求和
查看>>
J_Knight_ iOS 高级面试题 实战题解答以及一些扩展性链接
查看>>
使用php mongodb扩展时比较需要注意的事项
查看>>
AMQP的安装
查看>>
C语言小知识,摘自o'reilly著C程序设计新思维,人民邮电出版社
查看>>
深入详解SQL中的Null
查看>>
《转》完美解决微信video视频隐藏控件和内联播放问题
查看>>
AngularJs工具方法
查看>>
Django的模板系统
查看>>
jQuery自动触发事件
查看>>
跑步书籍推荐 --- 跑步指南
查看>>
1199 Problem B: 大小关系
查看>>
Elasticsearch 优化
查看>>
20145237《Java程序设计》第一周学习总结
查看>>