栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

工厂设计模式的优点(工厂模式和简单工厂模式的异同)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

工厂设计模式的优点(工厂模式和简单工厂模式的异同)

简单工厂模式

将对象的创建交给专门的工厂类负责,实现了对象的创建和对象的使用分离。

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		HumanFactory hf = new HumanFactory();
		//只能实例化接口类(Human),不能实例化(BlackHuman)
		Human bm = hf.CreateHuman("blackhuman");
		//工厂返回创建对象,main中根据需要具体调用方法
		bm.talk();
		Human ym = hf.CreateHuman("yellowhuman");
		Human wm = hf.CreateHuman("whitehuman");
		wm.talk();	
	}

}
public class HumanFactory {
	//此时要返回Human,这样创造出人的具体方法,在Test中根据需求调用
	//此工厂只建造返回人,不进行调用方法
//	public void createHuman(String Human) {  
//		if(Human.equals(Constant.BLACK)) {
//			BlackHuman b = new BlackHuman();
//			b.talk();
//		}else if(Human.equals(Constant.WHITE)){
//			WhiteHuman w = new WhiteHuman();
//			w.talk();
//		}
//		else if(Human.equals(Constant.YELLOW)){
//			YellowHuman y = new YellowHuman();
//			y.talk();
//		}
//		else {
//			System.out.println("不能创造这种肤色");
//		}
//	}
	
	public Human CreateHuman(String Human) {
		if(Human.equals(Constant.BLACK)) {
			return new BlackHuman();
		}else if(Human.equals(Constant.YELLOW)){
			return new YellowHuman();
		}else if(Human.equals(Constant.WHITE)){
			return new WhiteHuman();
		}else {
			return null;
		}
	}

}
public class BlackHuman implements Human {

	@Override
	public void talk() {
		// TODO Auto-generated method stub
		System.out.println("I'm BlackHuman");
	}

}
public interface Human {
	void talk();
}
public class Constant {
	public static final String BLACK= "blackhuman";
	public static final String WHITE= "whitehuman";
	public static final String YELLOW= "yellowhuman";

}
工厂方法模式

定义一个用于创建对象的接口或抽象类,让子类决定实例化哪一个类。

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		AbstractHumanFactory hf;
		//建造工厂,根据工厂创建人类
		hf = new BlackHumanFactory();
		//需要强制转型,
		BlackHuman bh = (BlackHuman) hf.CreateHuman();
		bh.talk();
		
		hf = new WhiteHumanFactory();
		WhiteHuman wh = (WhiteHuman) hf.CreateHuman();
		wh.talk();
	}

}

public class WhiteHumanFactory extends AbstractHumanFactory {
	@Override
	public Human CreateHuman() {
		return new WhiteHuman();
	}
}
public class WhiteHuman implements Human {

	@Override
	public void talk() {
		// TODO Auto-generated method stub
		System.out.println("I'm WhiteHuman");
	}

}
public interface Human {
	void talk();
}
public abstract class AbstractHumanFactory {
	public abstract Human CreateHuman();
}

抽象工厂模式

如果需要一个具体的工厂生产多种产品对象,比如,生产不同肤色的男人和女人,那么就需要用到抽象工厂模式了。

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		AbstractHumanFactory bf ;
		bf = new BlackFactory();
		BlackMan bm = (BlackMan)bf.CreateMan();
		bm.talk();
		
		bf = new BlackFactory();
		BlackWoman bw = (BlackWoman)bf.CreateWoman();
		bw.talk();
		
	}

}
public class BlackFactory extends AbstractHumanFactory{

	@Override
	public Human CreateMan() {
		// TODO Auto-generated method stub
		return new BlackMan();
	}

	@Override
	public Human CreateWoman() {
		// TODO Auto-generated method stub
		return new BlackWoman();
	}
	
}
public class BlackMan extends Man{
	@Override
	public void talk() {
		// TODO Auto-generated method stub
		System.out.println("I'm blackman");
	}
}
public class BlackWoman extends Man {
	@Override
	public void talk() {
		// TODO Auto-generated method stub
		System.out.println("I'm blackwoman");
	}

}
public abstract class Man implements Human {

	@Override
	public void talk() {
		// TODO Auto-generated method stub

	}

}
public abstract class Woman implements Human {

	@Override
	public void talk() {
		// TODO Auto-generated method stub

	}

}

public interface Human {
	void talk();
}
public abstract class AbstractHumanFactory {
	public abstract Human CreateMan();
	public abstract Human CreateWoman();
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/776272.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号