简介:

工厂模式(Factory Pattern)是 Java 中最罕用的设计模式之一。这种类型的设计模式属于创立型模式,它提供了一种创建对象的最佳形式。
工厂顾名思义就是生产产品的中央,工厂模式呢包含简略工厂,动态工厂,工厂办法,形象工厂等等,简略工厂和动态工厂呢我就不一一j介绍了,单例模式都能够当作一个动态工厂,咱们重点介绍工厂办法,形象工厂。

1、工厂办法

实用场景:

消费者不关怀他要创立的类(产品),或者消费者晓得本人要创立的是什么产品,然而并不关怀创立过程

模式实例:
1.1、Moveable:交通工具的父类
package com.mashibing.factory.factoryMethod;public interface Moveable {    void go();}
1.2、Car类,车辆类
package com.mashibing.factory.factoryMethod;public class Car implements Moveable{    public void go(){        System.out.println("Car go wuwuwuwuwuwuwu......"); }}
1.3、CarFactory:生成Car的工厂
package com.mashibing.factory.factoryMethod;public class CarFactory {    public Moveable create(){        System.out.println("a car created!"); return new Car(); }}
1.4、Plane:飞机类
package com.mashibing.factory.factoryMethod;public class Plane implements Moveable{    public void go() {        System.out.println("plane flying shuashua......"); }}
1.5、PlaneFactory:生成飞机的工厂
package com.mashibing.factory.factoryMethod;public class PlaneFactory {    public Moveable create(){        System.out.println("a plane created!"); return new Plane(); }}
1.6、测试类
package com.mashibing.factory.factoryMethod;public class Main {    public static void main(String[] args) {//        Moveable m = new CarFactory().create(); Moveable m = new PlaneFactory().create(); m.go(); }}

总结:我不关怀产品具体如何生产,我须要一辆车,那么我找到一个造车的工厂,你给我生成一辆车,我须要一架飞机,找到造飞机的工厂,你给我造一架飞机。
工厂办法模式,在扩大产品上比拟不便,如果我须要一艘船,那么我再加一个船的产品类和一个造船的工厂便行了

2、形象工厂模式

实用场景:

工厂办法模式在扩大产品下面是比拟不便,然而如果我要的不是一个产品,而是一系列产品呢,举个不大适合的例子(想不到太好的),比方:写一个小小的坦克大战游戏:外面的物体包含坦克,子弹,爆炸等等,一个一般的坦克打出一般的子弹产生一般的爆炸(这是一个产品族),一个升级版的坦克打出核弹产生威力更大的爆炸(这是另一个产品族),如果仍然应用工厂办法模式尽管能够实现,然而如同也不太好组织,那么咱们采纳形象工厂模式来试试。

模式实例:

坦克这个小游戏呢代码比拟多不好贴,咱们举个简略点的例子,一个现代人开着一辆车,吃着面包,拿着一把AK47的枪;一个魔法世界的人骑着扫把,吃着毒蘑菇,拿着魔法棒。

2.1 Food:食物抽象类
package com.mashibing.factory.abstractFactory;public abstract class Food {    abstract void printName();}
2.2、Bread:继承自Food
package com.mashibing.factory.abstractFactory;public class Bread extends Food{    public void printName(){        System.out.println("面包"); }}
2.3、Bread:继承自Food
package com.mashibing.factory.abstractFactory;public class MushRoom extends Food{    public void printName(){        System.out.println("毒蘑菇"); }}
2.4、Weapon:武器抽象类
package com.mashibing.factory.abstractFactory;public abstract class Weapon {    abstract void shoot();}
2.5、Ak47:继承自Weapon
package com.mashibing.factory.abstractFactory;public class Ak47 extends Weapon{    public void shoot(){        System.out.println("tututututu......"); }}
2.6、MagicStick:继承自Weapon
package com.mashibing.factory.abstractFactory;public class MagicStick extends Weapon{    public void shoot(){        System.out.println("diandian......"); }}
2.7、Vehicle:交通工具抽象类
package com.mashibing.factory.abstractFactory;public abstract class Vehicle {    abstract void go();}
2.8、Car:继承自Vehicle
package com.mashibing.factory.abstractFactory;public class Car extends Vehicle{    public void go(){        System.out.println("Car go wuwuwuwuwuwuwu......"); }}
2.9、Broom:继承自Vehicle
package com.mashibing.factory.abstractFactory;public class Broom extends Vehicle{    public void go(){        System.out.println("broom ........"); }}
2.10、abstract:形象工厂
package com.mashibing.factory.abstractFactory;/** * 形象工厂 */public abstract class AbstractFactory {    abstract Food createFood(); abstract Vehicle createVehicle(); abstract Weapon createWeapon();}
2.11、ModernFactory:为现代人服务的具体工厂
package com.mashibing.factory.abstractFactory;/** * 具体工厂 */public class ModernFactory extends AbstractFactory{    @Override    Food createFood() {        return new Bread(); }    @Override    Vehicle createVehicle() {        return new Car(); }    @Override    Weapon createWeapon() {        return new Ak47(); }}
2.12、MagicFactory:为魔法世界的人服务的具体工厂

package com.mashibing.factory.abstractFactory;
/**

  • 具体工厂

*/
public class MagicFactory extends AbstractFactory{

@OverrideFood createFood() {    return new MushRoom();

}

@OverrideVehicle createVehicle() {    return new Broom();

}

@OverrideWeapon createWeapon() {    return new MagicStick();

}
}

2.13、测试类
package com.mashibing.factory.abstractFactory;public class Main {    public static void main(String[] args) {        //魔法世界系列//        AbstractFactory f = new MagicFactory();//        Vehicle c = f.createVehicle();//        c.go();//        Weapon w = f.createWeapon();//        w.shoot();//        Food b = f.createFood();//        b.printName(); //现代人系列 AbstractFactory f = new ModernFactory(); Vehicle c = f.createVehicle(); c.go(); Weapon w = f.createWeapon(); w.shoot(); Food b = f.createFood(); b.printName(); }}