前言一、抽象工厂模式二、实现
1.步骤一2.步骤二3.步骤三 总结
前言
本人对于设计模式的学习,仅供参考!
一、抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定他们的类。每个生成的工厂都能按照工厂模式提供对象。
意图:提供一个创建一系列相关或相互依赖的对象的接口,而无需指定他们的具体类型
主要解决:主要解决接口选择问题。
何时使用:系统的产品有多于一个的产品族,而系统之消费其中某一族的产品。
如何解决:在一个产品族里面定义多个产品。
关键代码:在一个工厂类里面聚合多个同类产品。
二、实现 1.步骤一实现产品族的抽象类和工厂的抽象类:
//食物的抽象父类
public abstract class Food {
public abstract void printName();
}
//交通工具的抽象父类
public abstract class Vehicle {
public abstract void go();
}
//武器的抽象父类
public abstract class Weapon {
public abstract void shoot();
}
//工厂的抽象父类
public abstract class AbstractFactory {
public abstract Food createFood();
public abstract Vehicle createVehicle();
public abstract Weapon creatWeapon();
}
2.步骤二
实现一族产品及其工厂:
实现现代一族的产品及工厂
//现代一族的武器
public class AK47 extends Weapon {
@Override
public void shoot() {
}
}
//现代一族食物
public class Bread extends Food {
@Override
public void printName() {
}
}
//现代一族交通工具
public class Car extends Vehicle {
@Override
public void go() {
}
}
//现代一族产品的工厂
public class ModernFactory extends AbstractFactory {
@Override
public Food createFood() {
return new Bread();
}
@Override
public Vehicle createVehicle() {
return new Car();
}
@Override
public Weapon creatWeapon() {
return new AK47();
}
}
实现魔法一族的产品及工厂
//魔法一组的武器
public class MagicStick extends Weapon {
@Override
public void shoot() {
}
}
//魔法一组的食物
public class MushRoom extends Food {
@Override
public void printName() {
}
}
//现代一族交通工具
//魔法一组的交通工具
//魔法一组的交通工具
public class Broom extends Vehicle {
@Override
public void go() {
}
}
//现代一族产品的工厂
public class ModernFactory extends AbstractFactory {
@Override
public Food createFood() {
return new Bread();
}
@Override
public Vehicle createVehicle() {
return new Car();
}
@Override
public Weapon creatWeapon() {
return new AK47();
}
}
3.步骤三
使用工厂,获取实体类对象。
public class Main {
public static void main(String[] args) {
//魔法一族产品
AbstractFactory factory=new MagicFactory();
//切换为现代一族产品,只需要切换一个创建的工厂即可切换一族产品
//AbstractFactory factory1=new ModernFactory();
Food food=factory.createFood();
food.printName();
Vehicle vehicle=factory.createVehicle();
vehicle.go();
Weapon weapon=factory.creatWeapon();
weapon.shoot();
}
}
总结
形容词用接口,名词用抽象类。
工厂方法更便利于产品维度的扩展例如可以产品再加衣服、朋友等,抽象工厂模式更利于族维度的扩展,例如可以再加火星一族的产品(产品仍保持三个没有变)等。
更好的解决方案:Spring 的bean工厂



