【Java】工厂模式

工厂模式

萌妹子_liu发布于 今天 07:18

简介:

工厂模式(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的枪;一个魔法世界的人骑着扫把,吃着毒蘑菇,拿着魔法棒。
此图呢:我画的自己都有点迷糊,看完后面的代码之后,看这个图稍微好一些:
【Java】工厂模式

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{

@Override

Food createFood() {

return new MushRoom();

}

@Override

Vehicle createVehicle() {

return new Broom();

}

@Override

Weapon 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();

}

}

总结:在扩展一族产品上面抽象工厂模式比较方便,但是在扩展单个产品上面就不是那么方便,这是有好就有坏,参考spring的ioc,既能扩展单个产品也能扩展产品族,我还没研究,有研究之后写写笔记,谢谢

java

阅读 51更新于 34 分钟前

本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议

avatar

萌妹子_liu

1 声望

0 粉丝

0 条评论

得票时间

avatar

萌妹子_liu

1 声望

0 粉丝

宣传栏

简介:

工厂模式(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的枪;一个魔法世界的人骑着扫把,吃着毒蘑菇,拿着魔法棒。
此图呢:我画的自己都有点迷糊,看完后面的代码之后,看这个图稍微好一些:
【Java】工厂模式

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{

@Override

Food createFood() {

return new MushRoom();

}

@Override

Vehicle createVehicle() {

return new Broom();

}

@Override

Weapon 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();

}

}

总结:在扩展一族产品上面抽象工厂模式比较方便,但是在扩展单个产品上面就不是那么方便,这是有好就有坏,参考spring的ioc,既能扩展单个产品也能扩展产品族,我还没研究,有研究之后写写笔记,谢谢

以上是 【Java】工厂模式 的全部内容, 来源链接: utcz.com/a/107395.html

回到顶部