设计模式

1.单例模式 :

package com.ben.design;
/**
 * 单例模式
 * 场合:一个应用只需要一个,配置文件。工具类,线程池。日志对象
 * 类型:饿汉、懒汉模式
 * 
 * 1.将构造方法私有话,不允许外部直接创建
 * 2.创建类的唯一实例
 * 3.返回唯一实例对象方法
 * 下面是懒汉模式,
 */
public class Singleton {
	//饿汉模式
//	private static Singleton instance = new Singleton();
	//懒汉模式
	private static Singleton instance;
	private Singleton(){
		
	}
	public  static synchronized Singleton getInstance(){
		if (instance == null){
			instance = new Singleton();
		}
		return instance;				
	}	
}
2.简单工厂模式:

 简单工厂模式:
            1.生产接口
package com.ben.design;

public interface HairInterface {
	public void draw();
}
            2.具体生产车间
package com.ben.design;

public class LeftHair implements HairInterface {
	//实现了左偏分发型
	public void draw() {
		System.out.println("----左偏分----");
	}

}
package com.ben.design;

public class RightHair implements HairInterface {
	//实现了右偏分发型
	public void draw() {
		System.out.println("----右偏分----");
	}

}
            3.工厂类,调用具体的车间去生产
package com.ben.design;

import java.util.Map;

/**
 * 发型工厂
 * @author qweqwe
 *
 */
public class HairFactory {
	/**
	 * 根据类型创建对象
	 * 要是有多个实现类,则代码太冗余
	 * @return
	 */
	public HairInterface getHair(String key){
		if("left".equals(key)){
			return new LeftHair();
		}else if("right".equals(key)){
			return new RightHair();
		}else{
			return null;
		}			
	}
	/**
	 * 利用 反射,根据类的名称生产对象
	 * 不用再一个个if else new创建了
	 * spring BeanFactory就是使用这种方式
	 * @return
	 */
	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;
	}
	/**
	 * 上面方法的升级
	 * @param className
	 * @return
	 */
	public HairInterface getHairBykey(String key) {
		try {
			Map<String,String> 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;
	}
}
            4.配置文件读取类
package com.ben.design;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * properties文件的读取类
 * @author qweqwe
 *
 */
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);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
		return map;
	}
}
            5.测试类
package com.ben.design;

/**
 * 用来测试
 * 
 * @author qweqwe
 * 
 */
public class Test {
	public static void main(String[] args) {
		//1原始的生产方法, 太冗余
		// HairInterface left = new LeftHair();
		// left.draw();
		// HairInterface right = new RightHair();
		// right.draw();

		HairFactory factory = new HairFactory();
		//2
		// HairInterface left = factory.getHair("left");
		//3
//		HairInterface left = factory.getHairByClass("com.ben.design.LeftHair");
		//4
		HairInterface right = factory.getHairBykey("right");
		if (right != null)
			right.draw();
	}
}
    抽象工厂模式:一个工厂生产男装和女装,又分夏季和春季。这样就需要2个实际工厂,分别对应夏季和春季,同样,夏冬男装和女装要继承男女装接口。调用不同季节的工厂,生产不同季节的男女装
    实际就是将工厂再抽象一个抽象工厂,生产实际的工厂





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值