栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式--工厂模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式--工厂模式

目录

简单工厂模式

需求

基本介绍

代码示例

工厂方法模式

需求

基本介绍

代码示例

抽象工厂模式

基本介绍

代码示例

小结


简单工厂模式

需求

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

  1. 披萨的种类很多
  2. 披萨的制作有prepare,bake,cut,box
  3. 完成披萨店订购功能

基本介绍
  • 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实施。简单工厂模式是工厂模式家族中最简单实用的模式。
  • 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
  • 在软件开发中,当我们会用到大量的创建某种、某类或某批对象时,就会使用到工厂模式

代码示例
package com.zjb.design.factory.simple;


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;


public class SupremePizza extends Pizza{

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


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


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

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


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;


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;


public class PizzaStore {

    public static void main(String[] args) {
        new OrderPizza("supreme");
    }
}

工厂方法模式 需求

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

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


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;


public class LDPepperPizza extends Pizza{

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


public class LDCheesePizza extends Pizza{

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


public class BJPepperPizza extends Pizza{

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


public class BJCheesePizza extends Pizza{

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


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;


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;


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;


public class PizzaStore {

    public static void main(String[] args) {
        new BJOrderPizza("cheese");
    }
}

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


public interface AbsFactory {

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


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;


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;



public class BJCheesePizza extends Pizza {

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



public class BJPepperPizza extends Pizza {

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



public class LDPepperPizza extends Pizza {

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



public class LDCheesePizza extends Pizza {

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



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;


public class PizzaStore {

    public static void main(String[] args) {

        new OrderPizza(new BJFactory(),"cheese");
    }
}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/831008.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号