fenlei
1)简单工厂模式(Simple Factory)
2)工厂方法模式(Factory Method)3)抽象工厂模式(Abstract Factory)
也可将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。
/**
* 抽象产品角色
* @author Administrator
*
*/
public interface Car {
public void drive();
}
/**
* 具体产品类
* @author Administrator
*
*/
public class benzCar implements Car {
@Override
public void drive() {
System.out.println("驾驶奔驰车......");
}
}
/**
* 具体产品类
* @author Administrator
*
*/
public class bmwCar implements Car {
@Override
public void drive() {
System.out.println("驾驶宝马车......");
}
}
/**
* 工厂类角色
* @author Administrator
*
*/
public class driverFactory {
//返回类型必须为抽象产品角色
public static Car dirveCar(String params) throws Exception{
//判断逻辑,返回具体的产品角色给Client
if(params.equals("benzCar")){
return new benzCar();
}else if(params.equals("bmwCar")){
return new bmwCar();
}else{
throw new Exception();
}
}
}
//客户
public class Client {
public static void main(String[] args) throws Exception {
//告诉司机(工厂) 开奔驰车
Car car=driverFactory.dirveCar("benzCar");
//下命令开车
car.drive();
}
}
/**
* 抽象产品角色
* @author Administrator
*
*/
public interface Car {
public void drive();
}
/**
* 具体产品类
* @author Administrator
*
*/
public class benzCar implements Car {
@Override
public void drive() {
System.out.println("驾驶奔驰车......");
}
}
/**
* 具体产品类
* @author Administrator
*
*/
public class bmwCar implements Car {
@Override
public void drive() {
System.out.println("驾驶宝马车......");
}
}
/**
* 工厂类角色
* @author Administrator
*
*/
public class driverFactory {
//返回类型必须为抽象产品角色
public static Car dirveCar(String params) throws Exception{
//判断逻辑,返回具体的产品角色给Client
if(params.equals("benzCar")){
return new benzCar();
}else if(params.equals("bmwCar")){
return new bmwCar();
}else{
throw new Exception();
}
}
}
//客户
public class Client {
public static void main(String[] args) throws Exception {
//告诉司机(工厂) 开奔驰车
Car car=driverFactory.dirveCar("benzCar");
//下命令开车
car.drive();
}
}
简单工厂模式将逻辑全部集中在单个工厂中,工厂负责生产所有汽车,无论是奔驰还是宝马,缺点是每次加车型都要去工厂里改逻辑。这时工厂方法出现了
/**
* 抽象产品角色
* @author Administrator
*
*/
public interface Car {
public void drive();
}
/**
* 具体产品类
* @author Administrator
*
*/
public class benzCar implements Car {
@Override
public void drive() {
System.out.println("驾驶奔驰车......");
}
}
/**
* 具体产品类
* @author Administrator
*
*/
public class bmwCar implements Car {
@Override
public void drive() {
System.out.println("驾驶宝马车......");
}
}
/**
* 工厂类角色
* @author Administrator
*
*/
public class driverFactory {
//返回类型必须为抽象产品角色
public static Car dirveCar(String params) throws Exception{
//判断逻辑,返回具体的产品角色给Client
if(params.equals("benzCar")){
return new benzCar();
}else if(params.equals("bmwCar")){
return new bmwCar();
}else{
throw new Exception();
}
}
}
//客户
public class Client {
public static void main(String[] args) throws Exception {
//告诉司机(工厂) 开奔驰车
Car car=driverFactory.dirveCar("benzCar");
//下命令开车
car.drive();
}
}
/**
* 抽象产品角色
* @author Administrator
*
*/
abstract class Car {
abstract void drive();
}
/**
* 具体产品类
* @author Administrator
*
*/
public class bmwCar extends Car {
@Override
public void drive() {
System.out.println("驾驶宝马车......");
}
}
/**
* 具体产品类
* @author Administrator
*
*/
public class benzCar extends Car {
@Override
public void drive() {
System.out.println("驾驶奔驰车......");
}
}
/**
* 抽象工厂角色 用來生产车
* @author Administrator
*
*/
public interface abstractFactory {
public Car driveFactory();
}
/**
* 具体工厂角色
* 创建奔驰车对象
*/
public class benzCarFactory implements abstractFactory {
@Override
public Car driveFactory() {
return new benzCar();
}
}
/**
* 具体工厂角色
* 创建宝马车对象
*/
public class bmwCarFactory implements abstractFactory {
@Override
public Car driveFactory() {
return new bmwCar();
}
}
//客户
public class Client {
private static Car benzcar,bmwcar;
private static abstractFactory benzcarfactory,bmwcarfactory;
public static void main(String[] args) throws Exception {
//告诉(工厂) 要奔驰车
benzcarfactory=new benzCarFactory();
benzcar=benzcarfactory.driveFactory();
//可以开车了
benzcar.drive();
System.out.println("-------------------");
bmwcarfactory=new bmwCarFactory();
bmwcar=bmwcarfactory.driveFactory();
bmwcar.drive();
}
}
多个工厂,每个工厂生产自己的一种车
抽象工厂模式
/**
* 抽象产品角色
* @author Administrator
*
*/
public interface Car {
public void drive();
}
/**
* 具体产品类
* @author Administrator
*
*/
public class benzCar implements Car {
@Override
public void drive() {
System.out.println("驾驶奔驰车......");
}
}
/**
* 具体产品类
* @author Administrator
*
*/
public class bmwCar implements Car {
@Override
public void drive() {
System.out.println("驾驶宝马车......");
}
}
/**
* 工厂类角色
* @author Administrator
*
*/
public class driverFactory {
//返回类型必须为抽象产品角色
public static Car dirveCar(String params) throws Exception{
//判断逻辑,返回具体的产品角色给Client
if(params.equals("benzCar")){
return new benzCar();
}else if(params.equals("bmwCar")){
return new bmwCar();
}else{
throw new Exception();
}
}
}
//客户
public class Client {
public static void main(String[] args) throws Exception {
//告诉司机(工厂) 开奔驰车
Car car=driverFactory.dirveCar("benzCar");
//下命令开车
car.drive();
}
}
/**
* 抽象产品角色
* @author Administrator
*
*/
abstract class Car {
abstract void drive();
}
/**
* 具体产品类
* @author Administrator
*
*/
public class bmwCar extends Car {
@Override
public void drive() {
System.out.println("驾驶宝马车......");
}
}
/**
* 具体产品类
* @author Administrator
*
*/
public class benzCar extends Car {
@Override
public void drive() {
System.out.println("驾驶奔驰车......");
}
}
/**
* 抽象工厂角色 用來生产车
* @author Administrator
*
*/
public interface abstractFactory {
public Car driveFactory();
}
/**
* 具体工厂角色
* 创建奔驰车对象
*/
public class benzCarFactory implements abstractFactory {
@Override
public Car driveFactory() {
return new benzCar();
}
}
/**
* 具体工厂角色
* 创建宝马车对象
*/
public class bmwCarFactory implements abstractFactory {
@Override
public Car driveFactory() {
return new bmwCar();
}
}
//客户
public class Client {
private static Car benzcar,bmwcar;
private static abstractFactory benzcarfactory,bmwcarfactory;
public static void main(String[] args) throws Exception {
//告诉(工厂) 要奔驰车
benzcarfactory=new benzCarFactory();
benzcar=benzcarfactory.driveFactory();
//可以开车了
benzcar.drive();
System.out.println("-------------------");
bmwcarfactory=new bmwCarFactory();
bmwcar=bmwcarfactory.driveFactory();
bmwcar.drive();
}
}
// 抽象工厂类 定义不同的产品之间的标准,商务车
public interface ICarA {
public void drive();
}
// 抽象工厂类 定义不同的产品之间的标准 跑车族
public interface ICarB {
public void drive();
}
//具体产品类
public class productAHongqi implements ICarA {
@Override
public void drive() {
System.out.println("开商务族--红旗车");
}
}
//具体工厂类
public class productABmw implements ICarA {
@Override
public void drive() {
System.out.println("开商务族--宝马车 ...");
}
}
//具体产品类
public class producSporttBAudi implements ICarB {
@Override
public void drive() {
System.out.println("开跑车族--奥迪车...");
}
}
//具体工厂类
public class productSportBBenz implements ICarB {
@Override
public void drive() {
System.out.println("开跑车族--奔驰车 ...");
}
}
/**
* 抽象工厂类 创建跑车族跑车
* @author Administrator
*
*/
public abstract class abstractoryFactory1 {
abstract ICarB getProductBBenz();
abstract ICarB getProductBAudi();
}
/**
* 抽象工厂类 创建商务族跑车
* @author Administrator
*
*/
public abstract class abstractoryFactory2 {
abstract ICarA getProductABmw();
abstract ICarA getProductBHongqi();
}
/**
* 具体工厂类 跑车族
* @author Administrator
*
*/
public class Factory1 extends abstractoryFactory1 {
@Override
ICarB getProductBBenz() {
return new productSportBBenz();
}
@Override
ICarB getProductBAudi() {
return new producSporttBAudi();
}
}
/**
* 具体工厂类
* 商务族
* @author Administrator
*
*/
public class Factory2 extends abstractoryFactory2 {
@Override
ICarA getProductABmw() {
return new productABmw();
}
@Override
ICarA getProductBHongqi() {
return new productAHongqi();
}
}
public class Client {
public static void main(String[] args) {
//工厂一制造的产品族车
abstractoryFactory1 factory1 = new Factory1();
ICarB productsportAbenz = factory1.getProductBBenz();
ICarB productsportBaudi = factory1.getProductBAudi();
productsportAbenz.drive();
productsportBaudi.drive();
//工厂二制造的产品族车
abstractoryFactory2 factory2 = new Factory2();
ICarA productAbmw = factory2.getProductABmw();
ICarA productBhongqi = factory2.getProductBHongqi();
productAbmw.drive();
productBhongqi.drive();
}
}
表面上抽象工厂就是每个工厂里有一系列的产品(单个产品族,例如跑车)
六、和工厂方法模式区别
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建 一个 具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建 多个 具体产品类的实例。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个(产品族)。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例(一对一),而抽象工厂模式可以创建多个具体产品类的实例(一对多)。
/**
* 抽象产品角色
* @author Administrator
*
*/
abstract class Car {
abstract void drive();
}
/**
* 具体产品类
* @author Administrator
*
*/
public class bmwCar extends Car {
@Override
public void drive() {
System.out.println("驾驶宝马车......");
}
}
/**
* 具体产品类
* @author Administrator
*
*/
public class benzCar extends Car {
@Override
public void drive() {
System.out.println("驾驶奔驰车......");
}
}
/**
* 抽象工厂角色 用來生产车
* @author Administrator
*
*/
public interface abstractFactory {
public Car driveFactory();
}
/**
* 具体工厂角色
* 创建奔驰车对象
*/
public class benzCarFactory implements abstractFactory {
@Override
public Car driveFactory() {
return new benzCar();
}
}
/**
* 具体工厂角色
* 创建宝马车对象
*/
public class bmwCarFactory implements abstractFactory {
@Override
public Car driveFactory() {
return new bmwCar();
}
}
//客户
public class Client {
private static Car benzcar,bmwcar;
private static abstractFactory benzcarfactory,bmwcarfactory;
public static void main(String[] args) throws Exception {
//告诉(工厂) 要奔驰车
benzcarfactory=new benzCarFactory();
benzcar=benzcarfactory.driveFactory();
//可以开车了
benzcar.drive();
System.out.println("-------------------");
bmwcarfactory=new bmwCarFactory();
bmwcar=bmwcarfactory.driveFactory();
bmwcar.drive();
}
}
// 抽象工厂类 定义不同的产品之间的标准,商务车
public interface ICarA {
public void drive();
}
// 抽象工厂类 定义不同的产品之间的标准 跑车族
public interface ICarB {
public void drive();
}
//具体产品类
public class productAHongqi implements ICarA {
@Override
public void drive() {
System.out.println("开商务族--红旗车");
}
}
//具体工厂类
public class productABmw implements ICarA {
@Override
public void drive() {
System.out.println("开商务族--宝马车 ...");
}
}
//具体产品类
public class producSporttBAudi implements ICarB {
@Override
public void drive() {
System.out.println("开跑车族--奥迪车...");
}
}
//具体工厂类
public class productSportBBenz implements ICarB {
@Override
public void drive() {
System.out.println("开跑车族--奔驰车 ...");
}
}
/**
* 抽象工厂类 创建跑车族跑车
* @author Administrator
*
*/
public abstract class abstractoryFactory1 {
abstract ICarB getProductBBenz();
abstract ICarB getProductBAudi();
}
/**
* 抽象工厂类 创建商务族跑车
* @author Administrator
*
*/
public abstract class abstractoryFactory2 {
abstract ICarA getProductABmw();
abstract ICarA getProductBHongqi();
}
/**
* 具体工厂类 跑车族
* @author Administrator
*
*/
public class Factory1 extends abstractoryFactory1 {
@Override
ICarB getProductBBenz() {
return new productSportBBenz();
}
@Override
ICarB getProductBAudi() {
return new producSporttBAudi();
}
}
/**
* 具体工厂类
* 商务族
* @author Administrator
*
*/
public class Factory2 extends abstractoryFactory2 {
@Override
ICarA getProductABmw() {
return new productABmw();
}
@Override
ICarA getProductBHongqi() {
return new productAHongqi();
}
}
public class Client {
public static void main(String[] args) {
//工厂一制造的产品族车
abstractoryFactory1 factory1 = new Factory1();
ICarB productsportAbenz = factory1.getProductBBenz();
ICarB productsportBaudi = factory1.getProductBAudi();
productsportAbenz.drive();
productsportBaudi.drive();
//工厂二制造的产品族车
abstractoryFactory2 factory2 = new Factory2();
ICarA productAbmw = factory2.getProductABmw();
ICarA productBhongqi = factory2.getProductBHongqi();
productAbmw.drive();
productBhongqi.drive();
}
}
六、和工厂方法模式区别
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个(产品族)。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例(一对一),而抽象工厂模式可以创建多个具体产品类的实例(一对多)。