工厂模式

工厂模式定义:**任何可以产生对象的方法或类,都可以称之为工厂。**所以单例也是一种工厂。

工厂模式把原来new对象的方式,换成了用工厂来实现。为什么有了new之后,还要有工厂?是为了灵活控制生产过程,还可以控制对象访问权限,给对象添加修饰和日志等。

工厂系列的设计模式有:

  • 简单工厂
  • 静态工厂
  • 工厂方法
  • 抽象工厂

举例:用面向对象多态的方式,实现任意定制交通工具。

public interface Moveable { void go();}public class Plane implement Moveable { public void go() { System.out.println("plane flying shuashua....."); }}public class Car implement Moveable { public void go() { System.out.println("Car go wuwuwuwuwu....."); }}public class Broom implement Moveable { public void go() { System.out.println("Broom flying chuachua....."); }}public class Main { public static void main(String[] args) { Moveable m = new Plane(); m.go(); }}

以上小程序中,plane、car、broom都实现了Moveable接口,当我想换一种工具,只要换一个对象就好了,不需要重新new对象了。

简单工厂

当我们new一个交通工具的时候,如果有控制权限的要求,而每个对象的权限是不一样的。飞机有飞机的权限,汽车有汽车的权限。这时候用简单的面向对象的方式就不合适了。这时候就要用工厂,让产生对象的过程不用new,交给工厂处理。因为工厂可以灵活的控制生产过程,定制权限、修饰、日志。

举例:简单工厂

//交通工具工厂public class SimpleVehicleFactory { public Car createCar() { //before processing 前置处理 return new Car(); } public Broom createBroom() { //before processing 前置处理 return new Broom(); } public Plane createPlane() { //before processing 前置处理 return new Plane(); }}

简单工厂的可扩展性不好,每当我们添加一种交通工具,都要重新写一个方法,方法里面的东西都要重写。

工厂方法

我们可以针对每一种产品来做一个工厂。这种方法叫工厂方法。

举例:工厂方法,实现任意定制生产过程。

public class CarFactory { public Car create() { System.out.println("a car created!"); return new Car(); }}public class Main { public static void main(String[] args) { Moveable m = new CarFactory().create(); m.go(); }}

针对汽车,做一个汽车工厂,在里面添加new汽车的方法,以及new汽车的权限和日志等。当需要汽车时,只需要调用工厂的方法。当有很多种交通工具,每种交通工具都做一个工厂。

抽象工厂

上面介绍了用工厂模式任意定制交通工具和任意定制生产过程,工厂模式还可以任意定制产品一族。

汽车、AK47、wdm(味多美) 是一个族: 现代族

public class Car { public void go() { System.out.println("Car go wuwuwuwuwu....."); }}public class AK47 { public void shoot() { System.out.println("tutututu....."); }}public class Bread { public void printName() { System.out.println("wdm"); }}public static void main(String[] args) { Car c = new Car(); c.go(); AK47 w = new AK47(); w.shoot(); Bread b = new Bread(); b.printName();}

笤帚、魔法棒、dmg(毒蘑菇)是一族: 魔法族

public class Broom { public void go() { System.out.println("Broom flying chuachua....."); }}public class MagicStick { public void shoot() { System.out.println("diandain....."); }}public class MushRoom { public void printName() { System.out.println("dmg"); }}public static void main(String[] args) { Broom b = new Broom(); b.go(); MagicStick m = new MagicStick(); m.shoot(); MushRoom r = new MushRoom(); r.printName();}

现在我们已经定义好了两个产品族,现代族和魔法族。但是每当我想换一个族,都要改很多代码。如果我想再添加一个产品族的时候,不需要添加很多代码,也不要修改很多地方。这是要用到抽象工厂。

举例:抽象工厂,实现任意定制产品一族

//抽象工厂public abstract class AbstracFactory { //这个抽象的工厂,会生产3个抽象的产品 abstract Food createFood(); abstract Vehicle createVehicle(); abstract Weapon createWeapon();}public abstract class Food { abstract void printName();}public abstract class Weapon { abstract void shoot();}public abstract class Vehicle { abstract void go();}//现代工厂,继承抽象工厂,生产现代族的产品public class ModernFactory extends AbstractFactory { @Override Food createFood() { return new Bread(); } @Override Food createVehicle() { return new Car(); } @Override Food createWeapon() { return new AK47(); }}//魔法工厂,继承抽象工厂,生产魔法族的产品 public class MagicFactory extends AbstractFactory { @Override Food createFood() {return new MushRoom(); } @Override Food createVehicle() {return new Broom(); } @Override Food createWeapon() {return new MagicStick(); }}public static void main(String[] args) { AbstractFactory f = new ModernFactory(); Vehicle c = f.createVehicle(); c.go(); Weapon w = f.createWeapon(); w.shoot(); Food b = f.createFood(); b.printName();}

另外汽车和笤帚继承Vehicle,AK47和魔法棒继承Weapon,wdm和dmg继承Food。代码简单就我不写了。

抽象工厂的结构是:

抽象工厂(AbstracFactory)可以生产Vehicle、Weapon、Food这三个抽象的东西。

具体工厂 继承抽象工厂(AbstracFactory),具体工厂生产具体的东西,汽车、AK47等,这些东西都是从抽象工厂生产的抽象的东西继承。

打开网易新闻 查看精彩图片