简单工厂模式
- 优:客户端避免创建产品对象,而只是使用产品。
- 劣:产品需要符合开闭原则(对修改封闭,对拓展开放),简单工厂并不符合开闭原则。只有一个工厂类角色,当产品是多层次树状结构,工厂类不方便维护。
//抽象产品角色
interface Car {
void drive();
}
// 具体产品角色
class Benz implements Car {
public void drive() {
System.out.println("Car Benz is starting");
}
}
class Bmw implements Car {
public void drive() {
System.out.println("Car Bmw is starting");
}
}
// 工厂类角色
class Driver {
public static Car driverCar(String string) throws Exception {
if (string.equalsIgnoreCase("Benz")) {
return new Benz();
} else if (string.equalsIgnoreCase("Bmw")) {
return new Bmw();
} else {
throw new Exception();
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Car car = Driver.driverCar("Benz");
car.drive();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
工厂方法模式
- 优:产品和工厂都符合开闭原则
- 劣:当产品种类多的时候,工厂对象也会相应的增加。
//抽象工厂角色
interface Driver{
Car driverCar();
}
// 工厂类角色
class BenzDriver implements Driver{
public Car driverCar(){
return new Benz();
}
}
class BmwDriver implements Driver{
public Car driverCar(){
return new Bmw();
}
}
//使用者
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Driver driver = new BenzDriver();
Car car = driver.driverCar();
car.drive();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
抽象工厂模式(对对象进行抽象)
- 优:抽象工厂模式可以面对多个产品等级结构。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
- 劣:增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
//抽象工厂
public abstract class AbstractFactory {
public abstract Car getCar(String car);
public abstract Tire getTire(String tire);
}
/*****************************/
//抽象产品 轮胎
public interface Tire {
void train();
}
//抽象产品
public interface Car {
void drive();
}
/*****************************/
//实体类 子午线轮胎
public class RadialTire implements Tire {
@Override
public void train() {
// TODO: 2019-08-19
}
}
//实体类 防滑轮胎
public class AntiskidTire implements Tire {
@Override
public void train() {
// TODO: 2019-08-19
}
}
/*****************************/
//创建实现接口的实体类
public class Benz implements Car {
@Override
public void drive() {
//todo Benz created
}
}
//创建实现接口的实体类
public class Audi implements Car {
@Override
public void drive() {
//todo Audi created
}
}
/*****************************/
//创建一个工厂创造器
public class FactoryProducer {
public static AbstractFactory getFactory(String choice) {
if (choice.equalsIgnoreCase("CAR")) {
return new CarFactory();
} else if (choice.equalsIgnoreCase("TIRE")) {
return new TireFactory();
}
return null;
}
}