抽象工厂(掌握)
一般生产一套产品
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
关键代码:在一个工厂里聚合多个同类产品。
Test
package com.dp.factory.abstractfactory;
/**
* 抽象工厂-创建型模型,产生一系列产品
* 例如:海尔工厂给出的整体厨房装修方案或采用格力工厂给出的整体厨房装修方案
* 产生新的产品品种时改动的地方过多
* */
public class Test {
public static void main(String[] args) {
AbstractFactory f = new DefaultFactory(); //只需要换掉工厂就可以换掉一系列产品
//AbstractFactory f = new MagicFactory();
Vehicle c = f.createVehicle();
c.run();
Weapon ak = f.createWeapon();
ak.shoot();
Food a = f.createFood();
a.printName();
}
}
/*
开车
射击
Apple
*/
AbstractFactory
package com.dp.factory.abstractfactory;
public abstract class AbstractFactory {
public abstract Vehicle createVehicle();
public abstract Weapon createWeapon();
public abstract Food createFood();
}
DefaultFactory
package com.dp.factory.abstractfactory;
/**
* 默认工厂:产生默认的交通工具、武器、食品等产品
* */
public class DefaultFactory extends AbstractFactory{
@Override
public Vehicle createVehicle() {
return new Car();
}
@Override
public Weapon createWeapon() {
return new AK47();
}
@Override
public Food createFood() {
return new Apple();
}
}
MagicFactory
package com.dp.factory.abstractfactory;
/**
* 魔法工厂:产生魔法交通工具、武器、食品等产品
* */
public class MagicFactory extends AbstractFactory{
@Override
public Vehicle createVehicle() {
return new Broom();
}
@Override
public Weapon createWeapon() {
return new MagicStick();
}
@Override
public Food createFood() {
return new MushRoom();
}
}
Weapon
package com.dp.factory.abstractfactory;
/**
* 武器
* */
public abstract class Weapon {
public abstract void shoot();
}
AK47
package com.dp.factory.abstractfactory;
/**
* AK47武器
* */
public class AK47 extends Weapon{
public void shoot() {
System.out.println("射击");
}
}
MagicStick
package com.dp.factory.abstractfactory;
public class MagicStick extends Weapon{
@Override
public void shoot() {
System.out.println("魔法棒攻击");
}
}
Food
package com.dp.factory.abstractfactory;
/**
* 食品
* */
public abstract class Food {
public abstract void printName();
}
Apple
package com.dp.factory.abstractfactory;
/**
* 苹果食品
* */
public class Apple extends Food{
public void printName() {
System.out.println("Apple");
}
}
MushRoom
package com.dp.factory.abstractfactory;
public class MushRoom extends Food{
@Override
public void printName() {
System.out.println("MushRoom");
}
}
Vehicle
package com.dp.factory.abstractfactory;
/**
* 交通工具
* */
public abstract class Vehicle {
public abstract void run();
}
Car
package com.dp.factory.abstractfactory;
import java.util.ArrayList;
import java.util.List;
/**
* 汽车交通工具
* */
public class Car extends Vehicle{
public void run() {
System.out.println("开车");
}
}
Broom
package com.dp.factory.abstractfactory;
/**
* 魔法扫帚交通工具
* */
public class Broom extends Vehicle{
public void run() {
System.out.println("坐魔法扫帚");
}
}