1. 简单工厂/静态工厂
定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法
优点:简单易于实现,把类的实例化交给工厂,易于解耦。
缺点:违反了OCP开闭原则。
案例:JDK日期格式化DateFormat,JDK密钥生成器KeyGenerator
public class Factory{
public static Phone creator(String type){
Phone phone = null;
if(type.equalsIgnoreCase("hauwei")){
phone = new HuaweiPhone();
}else if(type.equalsIgnoreCase("xiaomi")){
phone = new XiaomiPhone();
}
return phone;
}
public static void main(String[] args) {
Phone xiaomiPhone = Factory.creator("xiaomi");
}
}
2. 工厂方法
在工厂方法模式中,不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构
优点:将具体创建工作交给子类去做,可以允许系统在不修改工厂角色的情况下引进新产品
缺点:添加新产品时,要写新的产品类,还要提供对应的具体工厂类,系统中类的个数将成对增加
案例:JDBC工厂、log日志记录器
interface Factory {
Phone produce();
}
public class HuaweiPhoneFactory implements Factory{
Phone produce(){ /* 生产华为手机 */}
}
public class XiaomiPhoneFactory implements Factory{
Phone produce(){ /* 生产小米手机*/ }
}
public class Test{
public static void main(String[] args) {
Factory huaweiFactory = new HuaweiPhoneFactory;
Factory xiaomiFactory = new xiaomiPhoneFactory;
Phone huaweiPhone = huaweiFactory.produce();
Phone xiaomiPhone = xiaomiFactory.produce();
}
}
3. 抽象工厂
抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品
优点:隔离了具体类的生成,可以实现高内聚低耦合的设计目的,符合“开闭原则”
缺点:开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)
public abstract class AbstractFactory{
public abstract AbstractProductA createProductA();
public abstract AbstractProductB createProductB();
}
public class ConcreteFactory1 extends AbstractFactory {
public AbstractProductA createProductA() {
return new ConcreteProductA1();
}
public AbstractProductB createProductB() {
return new ConcreteProductB1();
}
}
public class ConcreteFactory2 extends AbstractFactory {
public AbstractProductA createProductA() {
return new ConcreteProductA2();
}
public AbstractProductB createProductB() {
return new ConcreteProductB2();
}
}