• 工厂模式


       工厂模式的主要作用是创建对象,调用者只需要知道对象名字,通过接口调用对象,不必知道对象是怎么创建的,是典型的解耦模式, 有三种不同类型:简单工厂模式,工厂方法模式和抽象工厂模式。

      简单工厂模式:又叫静态工厂方法模式,有三种角色:工厂类角色,抽象产品角色,具体产品角色;下面将引用《head first 设计模式》中的例子去认识简单工厂模式;

      首先创建一个抽象产品类,不同的pizza有不同的制作方法,准备的材料,烘烤时间,切片方式,以及装盒都不同,所以首先先创建一个pizza的抽象类

    package org.yl;
    
    /**
     * Created by yelei on 17-4-8.
     */
    public abstract class Pizza {
    //pizza的制作过程
    public abstract void prepare(); public abstract void bake(); public abstract void cut(); public abstract void box(); }

    创建两个具体产品类继承Pizza类

    VeggiePizza类和CheesePizza类
    package org.yl;
    
    /**
     * Created by yelei on 17-4-8.
     */
    public class VeggiePizza extends Pizza {
        public void prepare(){
            System.out.println("准备VeggiePizza");
        }
        public void bake(){
            System.out.println("烘烤VeggiePizza");
        }
        public  void cut(){
            System.out.println("切片VeggiePizza");
        }
        public void box(){
            System.out.println("打包VeggiePizza");
        }
    }
    package org.yl;
    
    /**
     * Created by yelei on 17-4-8.
     */
    public class CheesePizza extends Pizza {
        public void prepare(){
            System.out.println("准备CheesePizza");
        }
        public void bake(){
            System.out.println("烘烤CheesePizza");
        }
        public  void cut(){
            System.out.println("切片CheesePizza");
        }
        public void box(){
            System.out.println("打包CheesePizza");
        }
    }

    然后开始创建工厂类:

    package org.yl;
    
    /**
     * Created by yelei on 17-4-8.
     */
    //这个工厂类专门用来创建实例
    public class PizzaFactory {
        //定义一个方法,通过这个方法来实例对象,只需要传入相应的参数
        public static Pizza createPizza(String type){
            Pizza pizza=null;
            if (type.equals("cheese")){
                  pizza=new CheesePizza();
            }else if (type.equals("veggiePizza")){
                  pizza=new VeggiePizza();
            }
            return pizza;
        }
    }

    使用时只需要调用

    Pizza pizza=PizzaFactory.createPizza("cheese");

    这个静态方法。不用去关心这个对象是如何创建的。但简单工厂模式违背了开闭原则。每增加一种类型的批萨都要在工厂里面去添加。

    工厂方法模式:工厂方法模式相对于简单工厂模式,是符合开闭原则,何为开闭原则,就是在新增需求的时候不必修改原有的代码,而是随意增加需要的类。

        工厂方法模式通过让子类决定创建对象是什么,有四种角色:抽象工厂角色,具体工厂角色,抽象产品角色,具体产品角色,这里以汽车为例。

    首先先定义一个抽象产品类Car 

    package org.yl;
    
    /**
     * Created by yelei on 17-4-9.
     */
    abstract class Car {
        private String name;
        public abstract void drive();
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    两个具体产品类:

    package org.yl;
    
    /**
     * Created by yelei on 17-4-9.
     */
    public class Benz extends Car{
        public void drive(){
            System.out.println(this.getName()+"........");
        }
    }
    package org.yl;
    
    /**
     * Created by yelei on 17-4-9.
     */
    public class BMW extends Car {
        public void drive(){
            System.out.println(this.getName()+".........");
        }
    }

    然后是抽象工厂类:

    package org.yl;
    
    /**
     * Created by yelei on 17-4-9.
     */
    abstract class Drive {
        public abstract Car createCar(String car);
    }

    具体工厂类:

    package org.yl;
    
    /**
     * Created by yelei on 17-4-9.
     */
    public class BenDrive extends Drive {
        public Car createCar(String car){
            return new Benz();
        }
    }
    package org.yl;
    
    /**
     * Created by yelei on 17-4-9.
     */
    public class BMWDrive extends Drive {
        public Car createCar(String car){
            return new BMW();
        }
    }

    使用:

    package org.yl;
    
    /**
     * Created by yelei on 17-4-8.
     */
    public class Main {
    
        public static void main(String[] args) {
           Drive drive=new BenDrive();
            Car car=drive.createCar("Benz");
            car.setName("Benz");
            car.drive();
    
        }
    
    
    }

    运行结果:   Benz........

    Process finished with exit code 0

      在框架中会经常用到,比如在springmvc中的业务逻辑层。虽然工厂设计模式符合开闭原则,新增需求的时候,不用去改变原有的代码,直接创建新类继承相应的抽象类,抽象工厂,但是每个工厂只负责生产一种产品,大量的类会给系统添加负担,抽象工厂模式为创建一组对象就提供了相应的解决方案,具体工厂就不只创建一种产品,而是产品族,具体的抽象工厂方法模式就自己去了解。                 

  • 相关阅读:
    廖雪峰Java6IO编程-2input和output-1inputStream
    安装spy-debugger查看前端日志
    廖雪峰Java6IO编程-1IO基础-1IO简介
    廖雪峰Java5集合-6Stack-1使用Stack
    廖雪峰Java5Java集合-5Queue-1使用Queue
    廖雪峰Java5集合-4Set-1使用Set
    20)升级登录标志
    19)加了验证码验证
    94)图片验证码
    18)添加引号转移函数,防止SQL注入
  • 原文地址:https://www.cnblogs.com/yeleia/p/6683194.html
Copyright © 2020-2023  润新知