目的:通过工厂来产生对象。
使用场景:当需要创建很多对象,这样如果需要修改对象,我们就可以直接修改这个工厂类;或者创建复杂对象时考虑使用。
分类:简单工厂模式、普通工厂模式、抽象工厂模式;
1.简单工厂模式
优点:结构简单,代码量少;
缺点:不符合开闭原则,每次添加产品都要修改StaticFactory这个类;
interface Product{}
class ProductA implements Product{}
class ProductB implements Product{}
class ProductC implements Product{}
public class StaticFactory {
private StaticFactory(){}
public static Product getA(){ return new ProductA(); }
public static Product getB(){ return new ProductB(); }
public static Product getC(){ return new ProductC(); }
}
class Client{
//客户端代码只需要将相应的参数传入即可得到对象
//用户不需要了解工厂类内部的逻辑。
public void get(String name){
Product x = null ;
if ( name.equals("A")) {
x = StaticFactory.getProductA();
}else if ( name.equals("B")){
x = StaticFactory.getProductB();
}else {
x = StaticFactory.getProductC();
}
}
}
2.普通工厂模式
优点:由于简单工厂违背了开放封闭原则;
缺点:每次添加一个产品都要添加对应的工厂类,增加了代码量;
public interface Factory {
Product createProduct();
}
生产ProductA的工厂FactoryA
public class FactoryA implements Factory {
@Override
public Product createProduct() {
return new ProductA();
}
}
生产ProductB的工厂FactoryB
public class FactoryB implements Factory {
@Override
public Product createProduct() {
return new ProductB();
}
}
同样地,生产ProductC的工厂FactoryC跟以上模式一样。
现在来根据新的工厂方法模式来生产
class Client{
//客户端代码只需要将相应的参数传入即可得到对象
//用户不需要了解工厂类内部的逻辑。
public void get(String name){
Factory x = null ;
if ( name.equals("A")) {
x = new FactoryA.createProduct();
}else if ( name.equals("B")){
x = new FactoryB.createProduct();
}else {
x = new FactoryC.createProduct();
}
}
}
3.抽象工厂模式
(1)通过反射实现的抽象工厂
普通工厂模式:一个具体的工厂类只生产一个具体的产品;
抽象工厂模式:一个具体的工厂类负责生产多个具体的产品;
优点:在普通工厂模式中,由于我们每添加一个产品都要添加对应的工厂模式,所以提出抽象工厂模式,这样就可以只存在一个抽象工厂类;
缺点:需要反射支持;
class AbstractFactory implements Factory{
private reflect ref;
public Product createProduct(class name){
//通过反射
return ref.instance(name);
}
}
(2)不通过反射实现的抽象工厂模式
4.工厂的模板类
struct Factory {
template<typename T, typename ...Args>
static std::unique_ptr CreateObj(Args ...args)
{
return std::make_unique(std::forward<Args>(args)...);
}
};