简单工厂模式
定义了一个创建对象的类,由这个类来封装实例化对象的行 为(代码)
相当于一个静态类,专门用于实例化对象
public class SimpleFactory {
/**
* 工厂方法 用此方法实例化对象
* @param name
* @return
*/
public static Product creatProduct(String name) {
if (name.equals("小米")) {
return new Xiaomi();
} else if (name.equals("华为")) {
return new HuaWei();
} else {
return null;
}
}
public static void main(String[] args) {
SimpleFactory.creatProduct("小米");
SimpleFactory.creatProduct("华为");
}
}
/**
* 定义一个产品抽象类
* 所有的商品都继承此类
*/
abstract class Product {
}
class Xiaomi extends Product {
public Xiaomi() {
System.out.println("生产小米手机");
}
}
class HuaWei extends Product {
public HuaWei() {
System.out.println("生产华为手机");
}
}
简单工厂模式 有新增产品需要修改工厂类,并且只能创建一类商品。
工厂模式
使用简单工厂模式时,工厂必须知道产品的所有实现细节,当新增产品时需要修改工厂类的逻辑代码,这违反开闭原则,对于一个成熟的类应该尽量做到不修改,可拓展。因此工厂模式可以很好的解决此问题。
工厂模式的工厂不再是一个具体的类而是一个接口在这里面规定的工厂的实现方法,工厂不在需要知道产品的具体实现细节,而是由接口的具体实现类去实现。子类工厂只需要实现工厂抽象,而之后如果有新增产品类,只需要实现抽象接口。
/**
* 工厂抽象接口
*/
public interface ProductFactory {
Product creatFactory();
}
/**
* 工厂实现类1
*/
class XiaomiFactory implements ProductFactory {
@Override
public Product creatFactory() {
return new Xiaomi();
}
}
/**
* 工厂实现类2
*/
class HuaweiFactory implements ProductFactory {
@Override
public Product creatFactory() {
return new Huawei();
}
}
abstract class Product {
}
class Xiaomi extends Product {
public Xiaomi() {
System.out.println("生产小米手机");
}
}
class Huawei extends Product {
public Huawei() {
System.out.println("生产华为手机");
}
}
抽象工厂类
对于工厂类,只能生产某一类商品。比如手机就只能生产手机,不能生产汽车。抽象工厂类可以生产多种类型的产品。抽象工厂类与工厂类的区别也很简单,即使可以生产多品类的商品,要实现生产其他品类的产品,只需要在抽象类中加入实现的规则即可。
/**
* 工厂抽象接口
*/
public interface ProductFactory {
Product1 creatFactory1();
Product2 creatFactory2();
}
可以看到要新增其他品类的方法需要修改工厂方法,这又违背开闭原则。具体使用哪一种模式要根据实际情况而定,没有完全的好与坏之分。