工厂模式
工厂模式分为两种,工厂方法和抽象工厂
- 工厂方法用于定制任意的产品,而抽象工厂用于定制任意的产品族
什么是工厂?
- 凡是能够生成对象的方法或类,都可以称作工厂
什么是工厂方法?
不同的对象通过不同的工厂来创建,可以指定各个对象的具体创建过程,如在创建对象前需要做什么,创建之后需要做什么,最终返回对象
- Car的工厂方法
//Car
public class Car implements Moveable {
@Override
public void go() {
System.out.println("car wowowo ...");
}
}
//接口
public interface Moveable {
void go();
}
//Car工厂
public class CarFactory {
public Moveable create() {
System.out.println("a car created !");
return new Car();
}
}
- Train的工厂方法
public class Train implements Moveable {
@Override
public void go() {
System.out.println("train wuwuwu ...");
}
}
public class TrainFactory {
public Moveable create() {
System.out.println("a train created !");
return new Train();
}
}
- 总之,工厂方法就是需要什么类,就构建对应类的工厂
xxxFactory.create();
什么是抽象工厂?
抽象工厂需要定义一个顶层的抽象工厂类,包含返回系列产品族的抽象方法,具体的工厂需要继承此抽象工厂,用于生产各种对象,同时,不同工厂生产的产品都属于同一产品族
- 定义各种产品的抽象类
public abstract class Food {
abstract void printName();
}
public abstract class Weapon {
abstract void attack();
}
public abstract class Vehicle {
abstract void go();
}
- 抽象的工厂,定义了生产产品的方式
/**
* 定制任意产品族
*/
public abstract class AbstractFactory {
abstract Vehicle createVehicle();
abstract Food createFood();
abstract Weapon createWeapon();
}
- 假设在现代社会中,人们开着车、嚼着面包,并且手里拿着M416准备奥里给的时候,那么我们的现代工厂如下所示
/**
* 现代产品族工厂
* 现代人开车、吃面包、用M416
*/
public class ModernFactory extends AbstractFactory {
@Override
Vehicle createVehicle() {
return new Car();
}
@Override
Food createFood() {
return new Bread();
}
@Override
Weapon createWeapon() {
return new M416();
}
}
- 如果在魔法世界,人们骑着扫帚,吃着蘑菇,然后用魔法棒来发动奥里给的时候,魔法工厂如下所示:
public class MagicFactory extends AbstractFactory {
@Override
Vehicle createVehicle() {
return new Broom();
}
@Override
Food createFood() {
return new MushRoom();
}
@Override
Weapon createWeapon() {
return new MagicStick();
}
}
- 接下来看看实例,现代人的生活方式如下
public class Main {
public static void main(String[] args) {
//现代人产品族
AbstractFactory factory = new ModernFactory();
Vehicle vehicle = factory.createVehicle();
Food food = factory.createFood();
Weapon weapon = factory.createWeapon();
vehicle.go();
food.printName();
weapon.attack();
}
}
- 如果在魔法世界,只需将factory指向MagicFactory对象的地址即可
public static void main(String[] args) {
//魔法人产品族
AbstractFactory factory = new MagicFactory();
Vehicle vehicle = factory.createVehicle();
Food food = factory.createFood();
Weapon weapon = factory.createWeapon();
vehicle.go();
food.printName();
weapon.attack();
}
- 封装对象时,什么时候使用抽象类,什么时候接口?
- 抽象类一般用于现实中存在的事物,但是不是某种具体的事物时,比如:食物、交通工具
- 接口一般用于抽象出事物通用的某种属性。比如:可移动的、圆形的
- 一般来说,抽象类描述名词,接口描述形容词