设计模式--工厂模式

设计模式--工厂模式,第1张

目录

简单工厂模式

需求

基本介绍

代码示例

工厂方法模式

需求

基本介绍

代码示例

抽象工厂模式

基本介绍

代码示例

小结


简单工厂模式 需求

做一个披萨的项目:要便于披萨种类的拓展,要便于维护

  1. 披萨的种类很多
  2. 披萨的制作有prepare,bake,cut,box
  3. 完成披萨店订购功能
基本介绍
  • 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实施。简单工厂模式是工厂模式家族中最简单实用的模式。
  • 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
  • 在软件开发中,当我们会用到大量的创建某种、某类或某批对象时,就会使用到工厂模式
代码示例
package com.zjb.design.factory.simple;

/**
 * @Author Kim
 * @Date 2022/4/23 13:28
 * @Desc 披萨抽象类
 */
public abstract class Pizza {
    private String name;

    abstract void prepare();

    public void bake(){
        System.out.println(name + "披萨正在制作");
    }

    public void cut(){
        System.out.println(name + "披萨正在切割");
    }

    public void box(){
        System.out.println(name + "披萨正在打包");
    }

    public void setName(String name) {
        this.name = name;
    }
}
package com.zjb.design.factory.simple;

/**
 * @Author Kim
 * @Date 2022/4/23 13:32
 * @Desc 至尊披萨
 */
public class SupremePizza extends Pizza{

    @Override
    void prepare() {
        System.out.println("正在准备原材料");
    }


}
package com.zjb.design.factory.simple;

/**
 * @Author Kim
 * @Date 2022/4/23 13:33
 * @Desc 美式披萨
 */
public class AmericanPizza extends Pizza{
    @Override
    void prepare() {
        System.out.println("正在准备原材料");
    }

}
package com.zjb.design.factory.simple;

/**
 * @Author Kim
 * @Date 2022/4/23 13:34
 * @Desc
 */
public class SimpleFactory {

    public static Pizza createPizza(String pizzaType){
        Pizza pizza = null;
        if(pizzaType.equals("supreme")){
            pizza = new SupremePizza();
            pizza.setName("至尊");
        }else if(pizzaType.equals("american")){
            pizza = new AmericanPizza();
            pizza.setName("美式");
        }
        return pizza;
    }

}
package com.zjb.design.factory.simple;

/**
 * @Author Kim
 * @Date 2022/4/23 13:36
 * @Desc 订购披萨
 */
public class OrderPizza {

    Pizza pizza = null;

    public OrderPizza(String pizzaType){
        pizza = SimpleFactory.createPizza(pizzaType);
        if(pizza == null){
            System.out.println("订购披萨失败:为找到相应的披萨种类");
        }else{
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }
    }
}
package com.zjb.design.factory.simple;

/**
 * @Author Kim
 * @Date 2022/4/23 13:28
 * @Desc 披萨的客户端
 */
public class PizzaStore {

    public static void main(String[] args) {
        new OrderPizza("supreme");
    }
}
工厂方法模式 需求

在点披萨时,可以点不同的口味,比如:北京的奶酪披萨,北京的胡椒披萨

基本介绍
  • 工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。
  • 工厂方法模式:定义一个创建对象的抽象方法,由子类决定是要实例化的类。工厂方法模式将对象的实例化推迟到子类。
代码示例
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 14:26
 * @Desc
 */
public abstract class Pizza {
    private String name;

    abstract void prepare();

    public void bake(){
        System.out.println(name + "披萨正在制作");
    }

    public void cut(){
        System.out.println(name + "披萨正在切割");
    }

    public void box(){
        System.out.println(name + "披萨正在打包");
    }

    public void setName(String name) {
        this.name = name;
    }
}
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 14:27
 * @Desc 伦敦胡椒
 */
public class LDPepperPizza extends Pizza{

    @Override
    void prepare() {
        setName("伦敦胡椒");
        System.out.println("正在准备原材料");
    }
}
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 14:27
 * @Desc 伦敦奶酪
 */
public class LDCheesePizza extends Pizza{

    @Override
    void prepare() {
        setName("伦敦奶酪");
        System.out.println("正在准备原材料");
    }
}
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 14:27
 * @Desc 北京胡椒
 */
public class BJPepperPizza extends Pizza{

    @Override
    void prepare() {
        setName("北京胡椒");
        System.out.println("正在准备原材料");
    }
}
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 14:27
 * @Desc 北京奶酪
 */
public class BJCheesePizza extends Pizza{

    @Override
    void prepare() {
        setName("北京奶酪");
        System.out.println("正在准备原材料");
    }
}
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 14:29
 * @Desc
 */
public abstract class OrderPizza {

    abstract Pizza createPizza(String orderType);

    public OrderPizza(String orderType){
        Pizza pizza = createPizza(orderType);
        if(pizza == null){
            System.out.println("订购披萨失败:为找到相应的披萨种类");
        }else{
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }
    }
}
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 14:34
 * @Desc
 */
public class LDOrderPizza extends OrderPizza{

    public LDOrderPizza(String orderType) {
        super(orderType);
    }

    @Override
    Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if(orderType.equals("cheese")){
            pizza = new LDCheesePizza();
        }else if(orderType.equals("pepper")){
            pizza = new LDCheesePizza();
        }
        return pizza;
    }
}
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 14:34
 * @Desc
 */
public class BJOrderPizza extends OrderPizza{

    public BJOrderPizza(String orderType) {
        super(orderType);
    }

    @Override
    Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if(orderType.equals("cheese")){
            pizza = new BJCheesePizza();
        }else if(orderType.equals("pepper")){
            pizza = new BJPepperPizza();
        }
        return pizza;
    }
}
package com.zjb.design.factory.factorymethod;

/**
 * @Author Kim
 * @Date 2022/4/23 13:28
 * @Desc 披萨的客户端
 */
public class PizzaStore {

    public static void main(String[] args) {
        new BJOrderPizza("cheese");
    }
}
抽象工厂模式 基本介绍
  • 抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类
  • 抽象工厂模式可以将简单工厂模式和工厂方法模式整合
  • 从设计层面看,抽象工厂模式就是对简单工厂模式的改进
  • 将工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样就将单个的简单工厂类变成了工厂簇,更利于代码的维护和拓展。
代码示例
package com.zjb.design.factory.absfactory;

/**
 * @Author Kim
 * @Date 2022/4/23 14:58
 * @Desc
 */
public interface AbsFactory {

    Pizza createPizza(String pizzaType);
}
package com.zjb.design.factory.absfactory;

/**
 * @Author Kim
 * @Date 2022/4/23 14:59
 * @Desc
 */
public class BJFactory implements AbsFactory{

    @Override
    public Pizza createPizza(String pizzaType) {
        Pizza pizza = null;
        if(pizzaType.equals("cheese")){
            pizza = new BJCheesePizza();
        }else if(pizzaType.equals("pepper")){
            pizza = new BJPepperPizza();
        }
        return pizza;
    }
}
package com.zjb.design.factory.absfactory;

/**
 * @Author Kim
 * @Date 2022/4/23 14:59
 * @Desc
 */
public class LDFactory implements AbsFactory{
    @Override
    public Pizza createPizza(String pizzaType) {
        Pizza pizza = null;
        if(pizzaType.equals("cheese")){
            pizza = new LDCheesePizza();
        }else if(pizzaType.equals("pepper")){
            pizza = new LDPepperPizza();
        }
        return pizza;
    }
}
package com.zjb.design.factory.absfactory;


/**
 * @Author Kim
 * @Date 2022/4/23 14:27
 * @Desc 北京奶酪
 */
public class BJCheesePizza extends Pizza {

    @Override
    void prepare() {
        setName("北京奶酪");
        System.out.println("正在准备原材料");
    }
}
package com.zjb.design.factory.absfactory;


/**
 * @Author Kim
 * @Date 2022/4/23 14:27
 * @Desc 北京胡椒
 */
public class BJPepperPizza extends Pizza {

    @Override
    void prepare() {
        setName("北京胡椒");
        System.out.println("正在准备原材料");
    }
}
package com.zjb.design.factory.absfactory;


/**
 * @Author Kim
 * @Date 2022/4/23 14:27
 * @Desc 伦敦胡椒
 */
public class LDPepperPizza extends Pizza {

    @Override
    void prepare() {
        setName("伦敦胡椒");
        System.out.println("正在准备原材料");
    }
}
package com.zjb.design.factory.absfactory;


/**
 * @Author Kim
 * @Date 2022/4/23 14:27
 * @Desc 伦敦奶酪
 */
public class LDCheesePizza extends Pizza {

    @Override
    void prepare() {
        setName("伦敦奶酪");
        System.out.println("正在准备原材料");
    }
}
package com.zjb.design.factory.absfactory;


/**
 * @Author Kim
 * @Date 2022/4/23 14:29
 * @Desc
 */
public class OrderPizza {

    public OrderPizza(AbsFactory absFactory,String orderType){
        Pizza pizza = absFactory.createPizza(orderType);
        if(pizza == null){
            System.out.println("订购披萨失败:为找到相应的披萨种类");
        }else{
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }
    }
}
package com.zjb.design.factory.absfactory;

/**
 * @Author Kim
 * @Date 2022/4/23 13:28
 * @Desc 披萨的客户端
 */
public class PizzaStore {

    public static void main(String[] args) {

        new OrderPizza(new BJFactory(),"cheese");
    }
}
小结
  1. 工厂模式的意义:将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的拓展和维护性
  2. 设计模式的依赖抽象原则
  • 在创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中并返回
  • 不要让类继承具体类,而是继承抽象类或者是实现interface接口
  • 不要覆盖基类中已经实现的方法 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/733366.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存