工厂模式实现了创建者和调用者的分离。
工厂模式定义了一个创建对象的接口,但由子类要实例化的类是哪一个。工厂方法让类把实例化推迟到子类
工厂模式有3种:简单工厂模式、工厂方法模式、抽象工厂模式
简单工厂模式:
网上有一个很经典的例子
抽象产品角色
package com.zw.mymaven;
//抽象产品角色
public interface Car {
public void drive();
}
具体产品角色
package com.zw.mymaven;
public class BMW implements Car {
public void drive() {
System.out.println("BMW is Running");
}
}
package com.zw.mymaven;
public class Benz implements Car {
public void drive() {
System.out.println("Benz is Running");
}
}
package com.zw.mymaven;
public class Audi implements Car {
public void drive() {
System.out.println("Audi is Running");
}
}
工厂类
package com.zw.mymaven;
public class CarFactory {
public static Car createCar(String s) {
if (s.equals("Benz")) {
return new Benz();
} else if (s.equals("BMW")) {
return new BMW();
} else if (s.equals("Audi")) {
return new Audi();
}
return null;
}
}
测试类
package com.zw.mymaven;
public class Test4 {
public static void main(String[] args) {
Car car = CarFactory.createCar("Benz");
car.drive();
}
}
想一想这一类的使用场景:我有一个生产车的工厂,里面生产3种汽车
工厂方法模式
现在使用场景变为:我有3家工厂,但奔驰工厂只能生产奔驰,奥迪工厂只能生产奥迪,BMW只能生产BMW
抽象产品角色
package com.zw.mymaven;
public class BMW implements Car {
public void drive() {
System.out.println("BMW is Running");
}
}
具体产品角色
package com.zw.mymaven;
public class BMW implements Car {
public void drive() {
System.out.println("BMW is Running");
}
}
package com.zw.mymaven;
public class Benz implements Car {
public void drive() {
System.out.println("Benz is Running");
}
}
package com.zw.mymaven;
public class Audi implements Car {
public void drive() {
System.out.println("Audi is Running");
}
}
抽象工厂
package com.zw.mymaven;
public abstract class AbstractFactory {
abstract Car create();
}
具体工厂
package com.zw.mymaven;
public class BenzFactory extends AbstractFactory {
@Override
Car create() {
return new Benz();
}
}
package com.zw.mymaven;
public class AudiFactory extends AbstractFactory {
@Override
Car create() {
return new Audi();
}
}
package com.zw.mymaven;
public class BMWFactory extends AbstractFactory {
@Override
Car create() {
return new BMW();
}
}
测试类
package com.zw.mymaven;
public class Test5 {
public static void main(String[] args) {
AbstractFactory factory = new BenzFactory();
Car car = factory.create();
car.drive();
}
}
抽象工厂模式
其实是对抽象方法模式的一种整合
产品类还是不变,我就不写了
抽象工厂
package com.zw.mymaven;
public abstract class AbstractFactory {
public abstract Benz createBenz();
public abstract Audi createAudi();
public abstract BMW createBMW();
}
具体工厂
package com.zw.mymaven;
public class AbstractFactoryimp extends AbstractFactory {
@Override
public Benz createBenz() {
return new Benz();
}
@Override
public Audi createAudi() {
return new Audi();
}
@Override
public BMW createBMW() {
return new BMW();
}
}
测试类
package com.zw.mymaven;
public class Test5 {
public static void main(String[] args) {
AbstractFactory factory = new AbstractFactoryimp();
Car car = factory.createBenz();
car.drive();
}
}