package com.freeflying.designmodle.factorymethod;
public interface Human {
public void getColor();//每个人的肤色
public void talk();//说话
}
/**
* 抽象人类创建工厂
* @ClassName: AbstractHumanFactory
* @Description:
* @author freeflying
* @date 2018年7月16日
*/
public abstract class AbstractHumanFactory {
public abstract <T extends Human> T createHuman(Class<T> clazz);
}
public class HumanFactory extends AbstractHumanFactory{
@Override
public <T extends Human> T createHuman(Class<T> clazz) {
Human human=null;
try {
human=(Human)Class.forName(clazz.getName()).newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
}
return (T)human;
}
}
public class YellowHuman implements Human{
@Override
public void getColor() {
System.out.println("黄人");
}
@Override
public void talk() {
System.out.println("黄人说话");
}
}
public class WhiteHuman implements Human{
@Override
public void getColor() {
System.out.println("白人");
}
@Override
public void talk() {
System.out.println("白人说话");
}
}
public class TestClass {
public static void main(String[] args) {
AbstractHumanFactory factory=new HumanFactory();
Human whuman=factory.createHuman(WhiteHuman.class);
whuman.getColor();
whuman.talk();
//....
}
}
通用代码
抽象产品类
public abstract class Product{
//产品类的公共方法
public void method1(){
}
//产品类的抽象方法
public abstract void method2();
}
//具体产品实现类
public class ConcreteProduct1 extends Product{
public void method2(){
//业务逻辑处理
}
}
抽象工厂类
public abstract class Creator{
public abstract <T extends Product> T createProduct(Class<T> c);
}
具体工厂类
public class ConcreteCreator extends Creator{
public <T extends Product> T createProduct(Class<T> c){
Product product=null;
try{
product=(Product)Class.forName(c.getName()).newInstance();
}catch(Exception e){
//处理异常
}
return (T)product;
}
}
//场景类
public class Client{
public static void main(String[] args){
Creator creator=new ConcreteCreator();
Product product=creator.createProduct(ConcreteProduct1.class);
}
}
优点:
1.良好的封装性,代码结构清晰,一个对象的创建是有约束条件的,如一个调用者需要一个具体的产品对象,只要知道这个产品的类名就行,不用知道创建对象的过程,降低了模块间耦合
2.扩展性好,在增加产品类的情况下,只要适当修改具体的工厂类或扩展一个工程类就可以完成变化了
类图: