一只烤鸭朝北走

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

  写在前面:程序设计中常见的设计模式有23种,大致可以分为:创建型模式、结构型模式、行为型模式,见下图;

 

  创建型模式:主要用于对象的创建;

  结构型模式:用于处理类或者对象的组合;

  行为型模式:用于描述类或对象怎样交互和分配职责;

  

 ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

  现在开启我们的设计模式之旅。。。。

  定义:简单工厂模式根据传入的参数不同,返回不同的对象,属于创建型设计模式;

  模式分析:主要有三类角色:

    1、Factory:工厂角色,专门用于创建实例类的工厂,该类提供一个方法,根据不同的参数返回不同的具体实例;

    2、Product:抽象产品角色,所有具体实例的父类;

    3、ConcreteProduct:具体产品角色,工厂真正生产的实例对象;

  UML类图:

   

 

 

 

 

 

  意义:简单工厂模式将对象的创建和对象本身的业务做了分离,降低了系统的耦合度,使得两者修改起来都相对容易一些;

  优点:

    1、实现了责任分割,提供了专门工厂类用于对象的创建;

    2、客户端无需知道所创建类的具体名称和创建逻辑,只需要知道具体创建对象所对应的参数即可;

    3、通过引入配置文件,可以在不修改任何客户端的代码的情况下,更换和增加具体的产品类,在一定程度上提高了系统的灵活性;

  缺点:

    1、工厂类集中了所有具体实例的创建逻辑,一旦不能正常工作,整个系统都会受到影响;

    2、工厂模式会增加系统中类的个数,一定程度上增加了系统的复杂度和理解难度;

  使用场景:

    1、工厂类负责创建的对象比较少的时;

    2、客户端只知道创建对象需要的参数,而不关心具体创建过程的时等;

  以下附demo源码:

  ===============================================================================================================================================  

  抽象产品类:
  
package cn.com.pep.model.simpleFactory;
/**
 * @Title: Pizza  
 * @Description:  抽象产品角色
 * @author wwh 
 * @date 2022-8-22 14:18:25
 */
public abstract class Pizza {
    /**
     * @Title: prepare
     * @Description:
     */
    public abstract void prepare();

    /**
     * @Title: bake
     * @Description:
     */
    public abstract void bake();

    /**
     * @Title: cut
     * @Description:
     */
    public abstract void cut();

    /**
     * @Title: box
     * @Description:
     */
    public abstract void box();
    
}

  具体产品类:

  

package cn.com.pep.model.simpleFactory;
/**
 * @Title: CheesePizza  
 * @Description:  具体产品角色
 * @author wwh 
 * @date 2022-8-22 14:22:53
 */
public class CheesePizza extends Pizza{

    @Override
    public void prepare() {
        System.err.println("prepare CheesePizza ...");
    }

    @Override
    public void bake() {
        System.err.println("bake CheesePizza ...");        
    }

    @Override
    public void cut() {
        System.err.println("cut CheesePizza ...");        
    }

    @Override
    public void box() {
        System.err.println("box CheesePizza ...");        
    }

}

package cn.com.pep.model.simpleFactory;
/**
 * @Title: ChocalatePizza  
 * @Description:  具体产品角色
 * @author wwh 
 * @date 2022-8-22 14:23:11
 */
public class ChocolatePizza extends Pizza{

    @Override
    public void prepare() {
        System.err.println("prepare ChocolatePizza ...");
    }

    @Override
    public void bake() {
        System.err.println("bake ChocolatePizza ...");
    }

    @Override
    public void cut() {
        System.err.println("cut ChocolatePizza ...");
    }

    @Override
    public void box() {
        System.err.println("box ChocolatePizza ...");
    }

}

package cn.com.pep.model.simpleFactory;

/**
 * @Title: VegetablePizza
 * @Description: 具体产品角色
 * @author wwh
 * @date 2022-8-22 14:22:42
 */
public class VegetablePizza extends Pizza {

    @Override
    public void prepare() {
        System.err.println("prepare VegetablePizza ...");
    }

    @Override
    public void bake() {
        System.err.println("bake VegetablePizza ...");

    }

    @Override
    public void cut() {
        System.err.println("cut VegetablePizza ...");
    }

    @Override
    public void box() {
        System.err.println("box VegetablePizza ...");
    }
} 
 工厂类:
package cn.com.pep.model.simpleFactory;

/**
 * @Title: SimplePizzaFactory
 * @Description: 工厂类
 * @author wwh
 * @date 2022-8-22 14:19:03
 */
public class SimplePizzaFactory {
    
    /**
     * @Title: createPizza 
     * @Description:  
     * @param type
     * @return
     */
    public static Pizza createPizza(String type) {
        Pizza pizza = null;
        
        if ("cheese".equals(type)) {
            pizza = new CheesePizza();
        }
        
        if ("vegetable".equals(type)) {
            pizza = new VegetablePizza();
        }
        
        if ("chocalate".equals(type)) {
            pizza = new ChocolatePizza();
        }
        
        return pizza;
    }

}
 测试类:
package cn.com.pep.model.simpleFactory;

/**
 * @Title: PizzaStore
 * @Description:
 * @author wwh
 * @date 2022-8-22 14:34:26
 */
public class PizzaStore {


    /**
     * @Title: orderPizza
     * @Description:
     * @param type
     * @return
     */
    public Pizza orderPizza(String type) {
        Pizza pizza = null;
        pizza = SimplePizzaFactory.createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}  
posted on 2022-08-26 15:46  一只烤鸭朝北走  阅读(68)  评论(0编辑  收藏  举报