工厂模式概念:
实例化对象,用工厂方法代替new操作
工行模式包括工厂方法模式和抽象工厂模式
抽象工厂模式是工厂方法模式的扩展
工厂模式意图
定义一个接口来创建对象,但是让子类决定哪些类需要被实例化
工厂方法把实例化的工作推迟到子类中去实现
什么情况下适合工厂模式
有一组类似的对象需要创建
在编码的时候不能预见需要创建哪种类的实例
系统需要考虑扩展性,不依赖于产品实力如何被创建
工厂模式的动机
在软件系统中经常面临着对象的创建工作,由于需求的变化,这个对象可能随之也会发生变化,但是它却拥有比较稳定的接口
为此,我们需要提供一种封装机制来隔离这个容易改变对象的变化,从而保持系统中其他依赖该对象的对象不随着需求变化而变化
**
以上都是废话,听不懂的直接看例子就好
**
一个游戏,需要捏脸,有三种发型,左偏右偏中间**
要实现它
第一步:创建一个接口 IHair
public interface IHair {
public void getHair();
}
第二步,创建接口的三个实现类
public class LeftHair implements IHair{
@Override
public void getHair() {
System.out.println("左偏");
}
}
public class RightHair implements IHair{
@Override
public void getHair() {
System.out.println("右偏");
}
}
public class MiddleHair implements IHair{
@Override
public void getHair() {
System.out.println("中间");
}
}
第三步:不用工厂模式的话,只能一个个的创建对象,调用对象的方法,输出对应的发型
public class Test {
public static void main (String [] args){
LeftHair leftHair=new LeftHair();
leftHair.getHair();
RightHair rightHair=new RightHair();
rightHair.getHair();
MiddleHair middleHair=new MiddleHair();
middleHair.getHair();
}
}
第三步,使用工厂模式,建立一个hairfactory类,传进hairType就可以自动创建对象
public class HairFactory {
public IHair getHair(String hairType){
if("left".equals(hairType)){//这里把left放在前面可以避免hairtype为空抛异常
return new LeftHair();
}else if("right".equals(hairType)){
return new RightHair();
}
return new MiddleHair();
}
}
测试类,借助工场创建对象即可
public class Test {
public static void main (String [] args){
HairFactory hairFactory=new HairFactory();
IHair left=hairFactory.getHair("left");
left.getHair();
}
}