Java 工厂模式
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
Sample sample=new Sample();
Sample sample=new Sample(参数);
ISample mysample=new MySample(); ISample hissample=new HisSample();
/** * 工厂模式 * @author lihuadong */ interface ISample{ //创建一个接口,并生成一个hello方法 void hello(); } class SampleA implements ISample{ //SampleA是ISample的实现类,重写hello方法 @Override public void hello() { // TODO Auto-generated method stub System.out.println("hello SampleA"); } } class SampleB implements ISample{ @Override public void hello() { // TODO Auto-generated method stub System.out.println("hello SampleB"); } } /** * 构造ISample的工厂Factory * 并实现一个creater(int)方法用于获取ISample对象 */ public class Factory { public static ISample creater(int which) { if(which == 1) return new SampleA(); else if(which == 2) return new SampleB(); return null; } public static void main(String[] args) { //测试:首先生成对象,然后调用hello()方法 ISample sampleA = Factory.creater(1); sampleA.hello(); ISample sampleB = Factory.creater(2); sampleB.hello(); } }
测试结果:
hello SampleA
hello SampleB
抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。主要解决接口选择的问题
具体实现
我们将创建 Shape 和 Color 接口和实现这些接口的实体类。下一步是创建抽象工厂类 AbstractFactory。接着定义工厂类 ShapeFactory 和 ColorFactory,这两个工厂类都是扩展了 AbstractFactory。然后创建一个工厂创造器/生成器类 FactoryProducer。AbstractFactoryPatternDemo,我们的演示类使用 FactoryProducer 来获取 AbstractFactory 对象。它将向 AbstractFactory 传递形状信息 Shape(big / small / verylarge),以便获取它所需对象的类型。同时它还向 AbstractFactory 传递颜色信息 Color(red / black / white),以便获取它所需对象的类型。
package Factory; /** * * @author lihuadong * abstract factory */ /** *Step one */ interface Shape{ //定义shape接口 void out(); } interface Color{ //定义color接口 void out(); } /** * Step two * 定义Shape的实现类--big,small,verylarge */ class Big implements Shape{ @Override public void out() { // TODO Auto-generated method stub System.out.println("big"); } } class Small implements Shape{ @Override public void out() { // TODO Auto-generated method stub System.out.println("small"); } } class VeryLarge implements Shape{ @Override public void out() { // TODO Auto-generated method stub System.out.println("very large"); } } /** * Step three * 定义Color的实现类--red,black,white */ class Red implements Color{ @Override public void out() { // TODO Auto-generated method stub System.out.println("red"); } } class Black implements Color{ @Override public void out() { // TODO Auto-generated method stub System.out.println("black"); } } class White implements Color{ @Override public void out() { // TODO Auto-generated method stub System.out.println("white"); } } /** * Step four * 为Color和Shape对象创建抽象类来获取工厂 */ abstract class AbstractFactory{ public abstract Shape getShape(String name); public abstract Color getColor(String name); } /** * Step five * 创建扩展了AbstractFactory的工厂类,基于给定的信息生成实体类对象 */ class ShapeFactory extends AbstractFactory{ @Override public Shape getShape(String shapeType) { // TODO Auto-generated method stub if(shapeType == null){ return null; } if(shapeType.equalsIgnoreCase("big")){ return new Big(); } else if(shapeType.equalsIgnoreCase("small")){ return new Small(); } else if(shapeType.equalsIgnoreCase("verylarge")){ return new VeryLarge(); } return null; } @Override public Color getColor(String colorType) { // TODO Auto-generated method stub return null; } } class ColorFactory extends AbstractFactory{ @Override public Shape getShape(String shapeType) { // TODO Auto-generated method stub return null; } @Override public Color getColor(String colorType) { // TODO Auto-generated method stub if(colorType == null){ return null; } if(colorType.equalsIgnoreCase("red")){ return new Red(); } else if(colorType.equalsIgnoreCase("black")){ return new Black(); } else if(colorType.equalsIgnoreCase("white")){ return new White(); } return null; } } /** * Step six * 创造一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂 */ class FactoryProducer{ public static AbstractFactory getFactory(String choice) { if(choice.equalsIgnoreCase("shape")) { return new ShapeFactory(); }else if(choice.equalsIgnoreCase("color")) { return new ColorFactory(); } return null; } } /** * Step seven * 抽象工厂的测试 */ public class Main { public static void main(String[] args) { //获取形状工厂 AbstractFactory shapeFactory = FactoryProducer.getFactory("shape"); //获取形状为big的对象 Shape big = shapeFactory.getShape("big"); //调用big对象的out方法 big.out(); //获取形状为small的对象 Shape small = shapeFactory.getShape("small"); //调用small对象的out方法 small.out(); //获取形状为verylarge的对象 Shape verylarge = shapeFactory.getShape("verylarge"); //调用verylarge对象的out方法 verylarge.out(); //获取颜色工厂 AbstractFactory colorFactory = FactoryProducer.getFactory("color"); //获取颜色为red的对象 Color red = colorFactory.getColor("red"); //调用red对象的out方法 red.out(); //获取颜色为black的对象 Color black = colorFactory.getColor("black"); //调用black对象的out方法 black.out(); //获取颜色为white的对象 Color white = colorFactory.getColor("white"); //调用white对象的out方法 white.out(); } }
运行结果:
big
small
very large
red
black
white
通过上面的例子,我们可以充分的理解抽象工厂的运行步骤和机理。