Java设计模式——创建型模式——工厂方法模式(Factory METHOD Pattern)
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
工厂方法模式的代码
/** * 产品的抽象接口 人类 * @author gyw * */ public interface Human { public void say(); }
/** * man 男人 * @author gyw * */ public class Man implements Human { /* say method * @see com.roc.factory.Human#say() */ @Override public void say() { System.out.println("男人"); } }
/**女人 * @author gyw * */ public class Woman implements Human { /* say method * @see com.roc.factory.Human#say() */ @Override public void say() { System.out.println("女人"); } }
/** * 工厂接口类 * @author gyw * */ public interface Factory { public Human crateMan(); }
/** * 创造男人工厂类 * @author gyw * */ public class ManFactory implements Factory{ public Human crateMan() { return new Man(); } }
/** * 创造女人工厂类 * @author gyw * */ public class WomanFactory implements Factory{ @Override public Human crateMan() { // TODO Auto-generated method stub return new Woman(); } }
/** * 抽象工厂测试 * @author gyw * */ public class Client { public static void main(String[] args) { Factory factory=new ManFactory(); Human man1=factory.crateMan(); man1.say(); Factory factory1 = new WomanFactory(); Human man2 = factory1.crateMan(); man2.say(); } }
利用反射实现工厂模式
- //细节:命名规则类,接口名称都得大写;
- // 写完代码记得格式化,就算是测试代码,贴出来也是给人看的。不能太水。
- interface Fruit {
- //接口中的 public abstract 都是多余的声明,eclipse是发现不了的。
- //若是有心人就换编辑器,intellij idea,
- void eat();
- }
- class Apple implements Fruit {
- public void eat() {
- System.out.println("Apple");
- }
- }
- class Orange implements Fruit {
- public void eat() {
- System.out.println("Orange");
- }
- }
- class Factory {
- public static Fruit getInstance(String ClassName) {
- Fruit f = null;
- try {
- f = (Fruit) Class.forName(ClassName).newInstance();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return f;
- }
- }
- class Hello {
- public static void main(String[] a) {
- Fruit f = Factory.getInstance("Reflect.Apple");
- if (f != null) {
- f.eat();
- }
- }
- }
工厂规则:
有个接口,作用是提供一个规则,估计也可以是一个抽象类,提供大部分公共方法的实现也是可以的
工厂商品:
商品的种类很多,各不相同,但是都有一个共通点,那就是都遵守上面的工厂规则。具体实现可以实现接口或者继承抽象方法等等。
工厂:
返回的是一个接口类型的商品对象,对外提供的也只是规则中包含的方法。根据商品之间的不同,来生产不同的商品。相当于父类型的引用指向其实现类或者子类,(多态),当然,也可以类型强制转换成子类对象。就像男人是人,人不一定是男人。类似这种关系。
Apple apple = (Apple) f;