工厂模式是在项目开发中使用效率高,意一个接口,该定义用于创建对象。让子类来决定哪一个类实例。
这就是一个工厂类的示意图
接着来一个简单的样例:
如上图所看到的,我们首先定义我们的产品抽象类接口,也能够是抽象类:
package factory; public abstract class PlatForm { public void search(){ System.out.println("你搜索的结果是。。。。。。
"); } public abstract void music(); }
以下是一些实现类
package factory; public class BaiduProduct extends PlatForm{ @Override public void music() { System.out.println("baidu music"); } }
package factory; public class Qihu360Product extends PlatForm{ @Override public void music() { System.out.println("360 music"); } }
package factory; public class SogouProduct extends PlatForm{ @Override public void music() { System.out.println("sogou music"); } }
三个实现类已经完毕,以下我们要来一个工厂的抽象类
package factory; public abstract class Creator { /** * 创建一个产品对象,当中T 能够为 String Enum Class等 參数能够自己设置 * @param c * @return */ public abstract <T extends PlatForm> T createProduct(Class<T> c); }以下是实现类
package factory; public class ConcrentCreator extends Creator{ @Override public <T extends PlatForm> T createProduct(Class<T> c) { PlatForm plat = null; try { /** * 创建一个用于创建对象的接口,让子类去确定实例化哪一个对象。工厂方法,让一个类的实例化延迟到子类 */ plat = (PlatForm) Class.forName(c.getName()).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return (T) plat; } }
package factory; public class Client { public static void main(String[] args) { Creator creator = new ConcrentCreator(); //在这里能够把你要实例化的类给传进去。然后就可以调用你想要的方法。PlatForm plat = creator.createProduct(BaiduProduct.class); plat.search(); plat.music(); } }
在这里面模仿了一个client,就能够输出你想要的结果。
在工厂模式方法中抽象产品类负责定义产品的共性,实现实物最抽象的定义;creator为产品抽喜创建类,也就是抽象工厂详细怎样创建产品类有详细的实现creator的工厂类来完毕。工厂类的变种非常多,以下,我总结类一个比較通用的源代码。
1:抽象产品类
package factory.total; public abstract class Product { public void method1(){ //全部产品的共性 } //抽象方法 详细有继承它的类去实现 public abstract void method2(); }2:产品实现类
package factory.total; public class ConcretProduct1 extends Product{ @Override public void method2() { //TODO } } package factory.total; public class ConcretProduct2 extends Product{ @Override public void method2() { //TODO } }
3:抽象工厂类
package factory.total; public abstract class Creator { public abstract <T extends Product> T createMethod(Class<T> c); }
4:详细工厂类:
package factory.total; public class ConcreteCreator extends Creator{ @Override public <T extends Product> T createMethod(Class<T> c) { Product pro = null; try { pro = (Product) Class.forName(c.getName()).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return (T) pro; } }
场景模拟类
package factory.total; public class Client { public static void main(String[] args) { Creator creator = new ConcreteCreator(); Product pro = creator.createMethod(ConcretProduct1.class); pro.method1(); pro.method2(); } }
当中工厂模式又分为简单工厂模式,和多级工厂模式,只是这两种情况。和上一种都比較类似了,当中简单工厂模式仅仅是简单的把抽象工厂类去掉,然后把工厂实现类的方法改成static方法。多级工厂模式是指:比如当我们见到一个比較复杂的项目时。全部的产品类都放到一个工厂类中去初始化会显得结构不清晰,那么我们如今就为每一种产品都有自己的一个工厂类;以下我会给出实例多级工厂类的应用。
我是有些基础类还是使用曾经的。仅仅只是为每一个产品添加了一个工厂类
1:抽象工厂类:
package factory.more; public abstract class AbstractPlatFactory { public abstract PlatForm createPlat(); }
2:详细工厂类:
package factory.more; public class BaiduFactory extends AbstractPlatFactory{ @Override public PlatForm createPlat() { // TODO Auto-generated method stub return new BaiduProduct(); } }
package factory.more; public class Qihu360Factory extends AbstractPlatFactory{ @Override public PlatForm createPlat() { return new Qihu360Product(); } }
package factory.more; public class SogouFactory extends AbstractPlatFactory{ @Override public PlatForm createPlat() { return new SogouProduct(); } }
场景类:
package factory.more; public class Client { public static void main(String[] args) { PlatForm plat = new BaiduFactory().createPlat(); plat.search(); plat.music(); } }这是多级工厂类的使用,
实际上还有抽象工厂类的应用,它是指为相关对象提供一组接口,如果没有指定具体的类。
(今天太晚了,过了一段时间,然后会说)
版权声明:本文博主原创文章。博客,未经同意不得转载。