工厂模式

目的:为了减少应用程序与具体类之间的依赖(松耦合),将对象的创建进行封装。所有的工厂都是用来封装对象的创建。


- 简单工厂模式。(简单工程其实不是一个设计模式,反而像是一种编程习惯)
- 工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
- 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体的类。

简单工厂

 

 代码示例:

复制代码
public class PizzaStore {
    SimplePizzaFactory factory;
    public PizzaStore(SimplePizzaFactory factory) {
        this.factory = factory;
    }
    
    /**
     * 订披萨
     * @param type
     * @return
     */
    Pizza orderPizza(String type) {
        Pizza pizza = factory.createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}

/**
 * 简单工厂模式。(简单工程其实不是一个设计模式,反而像是一种编程习惯)
 * 这是实例工厂,方法是实例方法。
 * 若将方法加上static,就是静态工厂。
 */
public class SimplePizzaFactory {
    public Pizza createPizza(String type) {
        Pizza pizza = null;
        if("cheese".equals(type)) {
            pizza = new ChessePizza();
        }else if("pepperoni".equals(type)) {
            pizza = new PepperoniPizza();
        }else if("clam".equals(type)) {
            pizza = new ClamPizza();
        }else if("veggie".equals(type)) {
            pizza = new VeggiePizza();
        }
        return pizza;
    }
}

奶酪         意大利辣香肠    蛤蜊       素食
ChessePizza、PepperoniPizza、ClamPizza、VeggiePizza 都是 Pizza 类的子类。
View Code
复制代码

 

 工厂方法模式

 

 

 

 

代码:

复制代码
public abstract class PizzaStore {
    
    // 工厂方法 模式
    abstract Pizza createPizza(String type);
    
    Pizza orderPizza(String type) {
        Pizza pizza = createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}

public class NYPizzaStore extends PizzaStore {

    @Override
    Pizza createPizza(String type) {
        Pizza pizza = null;
        if("cheese".equals(type)) {
            pizza = new NYStyleCheesePizza();
        }else if("pepperoni".equals(type)) {
            pizza = new NYStylePepperoniPizza();
        }else if("clam".equals(type)) {
            pizza = new NYStyleClamPizza();
        }else if("veggie".equals(type)) {
            pizza = new NYStyleVeggiePizza();
        }
        return pizza;
    }
}
public class ChicagoPizzaStore extends PizzaStore {

    @Override
    Pizza createPizza(String type) {
        Pizza pizza = null;
        if("cheese".equals(type)) {
            pizza = new ChicagoStyleCheesePizza();
        }else if("pepperoni".equals(type)) {
            pizza = new ChicagoStylePepperoniPizza();
        }else if("clam".equals(type)) {
            pizza = new ChicagoStyleClamPizza();
        }else if("veggie".equals(type)) {
            pizza = new ChicagoStyleVeggiePizza();
        }
        return pizza;
    }
}
View Code
复制代码

 

抽象工厂模式

 

 

例子的UML:

 

 

 代码:

复制代码
public abstract class PizzaStore {
    
    abstract Pizza createPizza(String type);
    
    Pizza orderPizza(String type) {
        Pizza pizza = createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}

public class NYPizzaStore extends PizzaStore {

    @Override
    Pizza createPizza(String type) {
        Pizza pizza = null;
        PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();
        if("cheese".equals(type)) {
            pizza = new CheesePizza(ingredientFactory);
            pizza.setName("New York Style Cheese Pizza");
        }else if("pepperoni".equals(type)) {
            pizza = new PepperoniPizza(ingredientFactory);
        }else if("clam".equals(type)) {
            pizza = new ClamPizza(ingredientFactory);
        }else if("veggie".equals(type)) {
            pizza = new VeggiePizza(ingredientFactory);
        }
        return pizza;
    }

}

public interface PizzaIngredientFactory {
    public Dough createDough();
    public Sauce createSauce();
    public Cheese createCheese();
    //...
}

public class NYPizzaIngredientFactory implements PizzaIngredientFactory {

    @Override
    public Dough createDough() {
        return new ThinCrustDough();
    }

    @Override
    public Sauce createSauce() {
        return new MarinaraSauce();
    }

    @Override
    public Cheese createCheese() {
        return new ReggianoCheese();
    }

}

public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {

    @Override
    public Dough createDough() {
        return new ThickCrustDough();
    }

    @Override
    public Sauce createSauce() {
        return new PlumTomatoSauce();
    }

    @Override
    public Cheese createCheese() {
        return new MozzarellaCheese();
    }

}
View Code
复制代码

 

posted @   htj10  阅读(51)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
历史上的今天:
2020-07-04 Java中的内省(introspector)
TOP
点击右上角即可分享
微信分享提示

目录导航