简单工厂
简单工厂模式也成静态工厂模式,但此模式不符合开闭原则,但仍然很常用
适用范围:工厂类需要创建的对象种类比较少,客户端只需要知道传入工厂类的参数,对于如何创建对象(逻辑)不关心
上段代码:
public abstract class Bread {public abstract void getBread();}public class Brioche extends Bread {@Overridepublic void getBread() {System.out.println("奶油面包");}}public class Sandwich extends Bread {@Overridepublic void getBread() {System.out.println("三明治");}}public class Doughnut extends Bread {@Overridepublic void getBread() {System.out.println("甜甜圈");}}public class BreadFactory {public static Bread createBread(Class c){try {Bread b = (Bread)Class.forName(c.getName()).newInstance();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}
工厂方法
工厂方法相比简单工厂的差别是工厂方法并不会自己去创建对象,它将创建方法交给子工厂实现,这样符合开闭原则,对于新增的类型只需扩展无需修改
代码如下:
public abstract class Bread {public abstract void getBread();}public class Brioche extends Bread {@Overridepublic void getBread() {System.out.println("奶油面包");}}public class Sandwich extends Bread {@Overridepublic void getBread() {System.out.println("三明治");}}public class Doughnut extends Bread {@Overridepublic void getBread() {System.out.println("甜甜圈");}}public abstract class AbstractBreadFactory{public abstract Bread createBread();}public class BriocheFactory extends AbstractBreadFactory{@Overridepublic Bread createBread() {return new Brioche();}}public class SandwichFactory extends AbstractBreadFactory{@Overridepublic Bread createBread() {return new Sandwich();}}public class DoughnutFactory extends AbstractBreadFactory{@Overridepublic Bread createBread() {return new Doughnut();}}
抽象工厂
用于产品族的构建。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
public interface Bread{public void getBread();public void getBreadSize();}public abstract class Doughnut implements Bread {@Overridepublic void getBread() {System.out.println("甜甜圈");}}public class BigDoughnut extends Doughnut{@Overridepublic void getBreadSize() {System.out.println("大号甜甜圈");}}public interface BreadFactory{public Bread createBrioche();public Bread createSandwich();public Bread createDoughnut();}public class BigFactory implements BreadFactory{@Overridepublic Bread createBrioche() {return new BigBrioche();}@Overridepublic Bread createSandwich() {return new BigSandwich();}@Overridepublic Bread createDoughnut() {return new BigDoughnut();}}