Define an interface for creating on object, but let subclasses decide which class to instantiate Factory Method lets a class defer instantiation to subclasses.
定义一个用于创建对象的接口,让子类决定实例化哪一类。
抽象产品类Product : 产品的抽象,归纳
抽象创建类Creator : 基于抽象层面,关心的只是抽象层,而不关心子类。类似于接口编程
public abstract class Product { //产品类的公共方法 public void method1(){ //业务逻辑处理 } //抽象方法 public abstract void method2(); }
public abstract class Creator { /* * 创建一个产品对象,其输入参数类型可以自行设置 * 通常为String、Enum、Class等,当然也可以为空 */ 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; } }
例子: 造人 ,人类大致分为白种人,黑种人,黄种人 ,这三种人统称为人类Human,抽象归纳为接口Human,人的肤色,语言,文化不同,暂且俩个公共业务方法talk()和getColoe(),在此基础上,产品抽象类已经构思完成,工厂抽象类就在这里,使用反射,多态,泛型技术面向接口编程。
ad
public interface Human { public void getColor(); public void talk(); }
public class WhiteMan implements Human { public void getColor() { System.out.println("白种人"); } public void talk() { System.out.println("English"); } }
public abstract class AbstractFactory { public abstract <T extends Human> T createHuman(Class<T> c); }
public class HumanFactory extends AbstractFactory { @Override public <T extends Human> T createHuman(Class<T> c) { Human human=null; try { human=(Human)Class.forName(c.getName()).newInstance(); } catch (Exception e) { System.out.println("生产人失败"); } return (T)human; } }
public static void main(String[] args) { AbstractFactory factory=new HumanFactory(); WhiteMan whiteMan= factory.createHuman(WhiteMan.class); whiteMan.getColor(); whiteMan.talk(); }
优点:扩展性好,面向接口编程,拥抱变化,代码结构清晰。
核心思想 : 归纳出一类产品,其中的公共业务,那些不同,那些相同,根据这些写出抽象接口,然后扩展就变得非常简单了。
扩展1: 替代单例模式
扩展2: 仿写JDBC连接池(个人胡思乱想)
public class SingletonFactory { private static Emperor emperor; //参照上一篇博客 static{ try { Class cl=Class.forName(Emperor.class.getName()); //获取class对象 Constructor constructor=cl.getDeclaredConstructor(); //获取构造方法 constructor.setAccessible(true); //设置构造方法为可访问 emperor=(Emperor) constructor.newInstance(); //实例化 } catch (Exception e) { e.printStackTrace(); } } public static Emperor getEmperor(){ return emperor; } }
public class JDBCPool { private static final Map<String,Connection> prMap=new HashMap(); private final static int MaxConections=5; //最大连接数 public static synchronized Connection createConnection(String connName){ Connection con=null; if(prMap.size()<MaxConections){ con=new Connection(); prMap.put(connName, con); } return con; } }
我是菜鸟,我在路上。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-11 22:01:59