网站推广有什么方法,wordpress 模板调用,分类达人介绍,学建网站用女蜗造人阐述工厂模式
1.1 一个工厂模式 现在女娲要造人#xff0c;她要造三种人#xff1a;白种人、黄种人和黑种人。怎么造呢#xff1f;她得有个能产生人类的工厂吧#xff08;类似于八卦炉的东西#xff09;#xff0c;这个工厂得让她生产出不同的人种。每个人都有…
用女蜗造人阐述工厂模式
1.1 一个工厂模式 现在女娲要造人她要造三种人白种人、黄种人和黑种人。怎么造呢她得有个能产生人类的工厂吧类似于八卦炉的东西这个工厂得让她生产出不同的人种。每个人都有两个属性皮肤颜色和说话
抽象接口Human是人类里面有两个方法getColor获得皮肤颜色talk交谈。下面三个具体Human的实现类分别实现三个人种。根据工厂模式应该有个抽象工厂AbstractHumanFactory就担当了这个责任里面有个抽象方法createHuman那HumanFactory就是实现类了实现抽象工厂里的方法。下面我们看看具体实现
public interface Human { public void getColor();//人有不同的颜色 public void talk(); //人会说话
} 接下来对Human接口的不同实现
public class BlackHuman implements Human {// 黑种人Overridepublic void getColor() {System.out.println(Black);}Overridepublic void talk() {System.out.println(Black man);}
}
public class Human implements Human { //黄种人Overridepublic void getColor() {System.out.println(Yellow);}Overridepublic void talk() {System.out.println(Yellow man);}
}
public class WhiteHuman implements Human {//白种人Overridepublic void getColor() {System.out.println(White);}Overridepublic void talk() {System.out.println(White man);}
}
好了人的模子搞好了现在女娲要开始搭建八卦炉了 public abstract class AbstractHumanFactory{public abstract T extends Human T createHuman(ClassT clazz); //注意这里T必须是Human的实现类才行因为要造Human嘛
} public class HumanFactory extends AbstractHumanFactory {Overridepublic T extends Human T createHuman(ClassT clazz) {Human human null;try {human (Human) Class.forName(clazz.getName()).newInstance();} catch (Exception e) { //异常处理System.out.println(人种产生错误);}return (T) human;}
}
public class FactoryTest {public static void main(String[] args) {AbstractHumanFactory bagualu new HunmanFactory();Human blackMan bagualu.createHuman(BlackHuman.class); //黑人诞生了Human yellowMan bagualu.createHuman(YelloHuman.class); //黄人诞生了Human whiteMan bagualu.createHuman(WhiteHuman.class); //白人诞生了}
}
这就是工厂模式 1.2 静态工厂模式 我们还用上面女娲造人的例子说明现在女娲在思考一个问题我现在只需要一个工厂就可以把人生产出来我干嘛要具体的工厂对象呢我只要使用静态方法就好了。这样一想于是女娲就开始把AbstractHumanFactory抽象类去掉了只保留了HumanFactory类同时把createHuman方法设置成了static类型搞定
public class HumanFactory {public static T extends Human T createHuman(ClassT clazz) {Human human null;try {human (Product) Class.forName(clazz.getName()).newInstance();} catch (Exception e) { //异常处理System.out.println(人种产生错误);}return (T) human;}
} 这就是静态工厂模式在实际项目中根据需求可以设置成静态工厂类但是缺点是扩展比较困难如果就一个工厂不需要扩展可以这么设计仍然是很常用的。
1.3 多个工厂模式 abstractHumanFactory抽象类我们就要改写:
public abstract class AbstractHumanFactory {public abstract Human createHuman();
}
public class BlackHumanFactory extends AbstractHumanFactory {public Human createHuman() {return new BlackHuman();}
}
public class YellowHumanFactory extends AbstractHumanFactory {public Human createHuman() {return new YellowHuman();}
}
public class WhiteHumanFactory extends AbstractHumanFactory {public Human createHuman() {return new WhiteHuman();}
}
public class FactoryTest {public static void main(String[] args) {Human blackMan new BlackHumanFactory().createHuman(); //黑人诞生了Human yellowMan new YellowHumanFactory().createHuman(); //黄人诞生了Human whiteMan new WhiteHumanFactory().createHuman(); //白人诞生了}
} 这种工厂模式的好处是职责清晰结构简单但是给扩扩展性和可维护性带来了一定的影响因为如果要扩展一个产品类就需要建立一个相应的工厂类这样就增加了扩展的难度。因为工厂类和产品类的数量是相同的维护时也需要考虑两个对象之间的关系。但是这种模式还是很常用的。